Найти PID процесса, использующего порт в Windows
Мой сервис падает при запуске с классическим:
java.rmi.server.ExportException: Listen failed on port: 9999
Как я могу найти процесс его убийства?
6 ответов
Просто откройте командную оболочку и введите: (скажем, ваш порт 123456)
netstat -a -n -o | find "123456"
Вы увидите все, что вам нужно
Заголовки:
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:37 0.0.0.0:0 LISTENING 1111
Найти PID процесса, который использует порт в Windows (например, порт:"9999")netstat -aon | find "9999"
-a
Отображает все соединения и порты прослушивания.
-o
Отображает идентификатор процесса-владельца, связанный с каждым соединением.
-n
Отображает адреса и номера портов в числовой форме.
выход:TCP 0.0.0.0:9999 0.0.0.0:0 LISTENING 15776
Затем убить процесс с помощью PIDtaskkill /F /PID 15776
/F
- Указывает на принудительное завершение процесса (ов).
Примечание: вам может потребоваться дополнительное разрешение (запуск от администратора), чтобы убить некоторые определенные процессы
команда: netstat -aon | findstr 4723
вывод: TCP 0.0.0.0:4723 0.0.0.0:0 СЛУШАТЬ 10396
Теперь вырезать идентификатор процесса "10396", используя для команды в Windows.
команда: for / f "tokens = 5"% a in ('netstat -aon ^ | findstr 4723') do @echo% ~ nxa
выход:10396
если вы хотите сократить 4-е число значения, значит "СЛУШАТЬ", то команда в окнах.
команда: for / f "tokens = 4"% a in ('netstat -aon ^ | findstr 4723') do @echo% ~ nxa
вывод: СЛУШАТЬ
Я надеюсь, что мой ответ поможет вам!
Если вы хотите сделать это программно, вы можете использовать некоторые из следующих параметров в скрипте PowerShell:
$processPID = $($(netstat -aon | findstr "9999")[0] -split '\s+')[-1]
taskkill /f /pid $processPID
Тем не мение; Имейте в виду, что чем точнее вы можете быть, тем точнее будет ваш результат PID. Если вы знаете, на каком хосте должен находиться порт, вы можете сильно его сузить. netstat -aon | findstr "0.0.0.0:9999"
вернет только одно приложение и, скорее всего, правильное. Только поиск по номеру порта может привести к возврату процессов, которые имеют только 9999
в нем вот так:
TCP 0.0.0.0:9999 0.0.0.0:0 LISTENING 15776
UDP [fe80::81ad:9999:d955:c4ca%2]:1900 *:* 12331
Наиболее вероятный кандидат обычно заканчивается первым, но если процесс завершился до того, как вы запустили свой скрипт, вы можете получить вместо этого PID 12331 и убить неправильный процесс.
После некоторого возни со сценарием я пришел к этому действию. Скопируйте и сохраните его в файле.bat:
FOR /F "usebackq tokens=5" %%i IN (`netstat -aon ^| find "3306"`) DO taskkill /F /PID %%i
измените 'find "3306" в номере порта, который должен быть свободным. Затем запустите файл от имени администратора. Это убьет все процессы, запущенные на этом порту
PowerShell (Core-совместимый) однострочный для упрощения сценариев копирования:
netstat -aon | Select-String 8080 | ForEach-Object { $_ -replace '\s+', ',' } | ConvertFrom-Csv -Header @('Empty', 'Protocol', 'AddressLocal', 'AddressForeign', 'State', 'PID') | ForEach-Object { $portProcess = Get-Process | Where-Object Id -eq $_.PID; $_ | Add-Member -NotePropertyName 'ProcessName' -NotePropertyValue $portProcess.ProcessName; Write-Output $_ } | Sort-Object ProcessName, State, Protocol, AddressLocal, AddressForeign | Select-Object ProcessName, State, Protocol, AddressLocal, AddressForeign | Format-Table
Выход:
ProcessName State Protocol AddressLocal AddressForeign
----------- ----- -------- ------------ --------------
System LISTENING TCP [::]:8080 [::]:0
System LISTENING TCP 0.0.0.0:8080 0.0.0.0:0
Тот же код, удобный для разработчиков:
$Port = 8080
# Get PID's listening to $Port, as PSObject
$PidsAtPortString = netstat -aon `
| Select-String $Port
$PidsAtPort = $PidsAtPortString `
| ForEach-Object { `
$_ -replace '\s+', ',' `
} `
| ConvertFrom-Csv -Header @('Empty', 'Protocol', 'AddressLocal', 'AddressForeign', 'State', 'PID')
# Enrich port's list with ProcessName data
$ProcessesAtPort = $PidsAtPort `
| ForEach-Object { `
$portProcess = Get-Process `
| Where-Object Id -eq $_.PID; `
$_ | Add-Member -NotePropertyName 'ProcessName' -NotePropertyValue $portProcess.ProcessName; `
Write-Output $_;
}
# Show output
$ProcessesAtPort `
| Sort-Object ProcessName, State, Protocol, AddressLocal, AddressForeign `
| Select-Object ProcessName, State, Protocol, AddressLocal, AddressForeign `
| Format-Table
Это помогает найти PID, используя номер порта.
lsof -i tcp:port_number