Мой сервис вылетает при запуске с классикой:
java.rmi.server.ExportException: Listen failed on port: 9999
Как мне найти способ его убить?
Мой сервис вылетает при запуске с классикой:
java.rmi.server.ExportException: Listen failed on port: 9999
Как мне найти способ его убить?
Ответы:
Просто откройте командную оболочку и введите (например, ваш порт - 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
nestat -aon | findstr 123456
Найдите PID процесса, который использует порт в Windows (например, порт: «9999»)
netstat -aon | find "9999"
-a
Отображает все подключения и порты прослушивания.
-o
Отображает идентификатор процесса-владельца, связанный с каждым подключением.
-n
Отображает адреса и номера портов в числовой форме.
Вывод:
TCP 0.0.0.0:9999 0.0.0.0:0 LISTENING 15776
Затем убейте процесс по PID
taskkill /F /PID 15776
/F
- Задает принудительное завершение процесса (ов).
Примечание: вам может потребоваться дополнительное разрешение (запуск от администратора), чтобы убить некоторые определенные процессы.
Если вы хотите сделать это программно, вы можете использовать некоторые из предоставленных вам параметров в сценарии 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
Измените "найти" 3306 "в номере порта, который должен быть свободным. Затем запустите файл от имени администратора. Это убьет все процессы, запущенные на этом порту.
Команда:
netstat -aon | findstr 4723
Вывод:
TCP 0.0.0.0:4723 0.0.0.0:0 LISTENING 10396
Теперь вырежьте идентификатор процесса «10396» с помощью for
команды в Windows.
Команда:
for /f "tokens=5" %a in ('netstat -aon ^| findstr 4723') do @echo %~nxa
Вывод:
10396
Если вы хотите вырезать 4-е число в значении, значит «ПРОСЛУШИВАНИЕ», тогда команда в Windows.
Команда:
for /f "tokens=4" %a in ('netstat -aon ^| findstr 4723') do @echo %~nxa
Вывод:
ПРОСЛУШИВАНИЕ
Это помогает найти PID по номеру порта.
lsof -i tcp:port_number
'lsof' is not recognized as an internal or external command.
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