Мої сервісні збої при запуску з класичним:
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