Moja usługa ulega awarii podczas uruchamiania z klasyczną wersją:
java.rmi.server.ExportException: Listen failed on port: 9999
Jak mogę znaleźć proces zabijania go?
Moja usługa ulega awarii podczas uruchamiania z klasyczną wersją:
java.rmi.server.ExportException: Listen failed on port: 9999
Jak mogę znaleźć proces zabijania go?
Odpowiedzi:
Po prostu otwórz powłokę poleceń i wpisz (mówiąc, że twój port to 123456):
netstat -a -n -o | find "123456"
Zobaczysz wszystko, czego potrzebujesz.
Nagłówki to:
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:37 0.0.0.0:0 LISTENING 1111
nestat -aon | findstr 123456
Znajdź PID procesu, który używa portu w systemie Windows (np. Port: „9999”)
netstat -aon | find "9999"
-a
Wyświetla wszystkie połączenia i porty nasłuchu.
-o
Wyświetla identyfikator procesu będącego właścicielem, powiązany z każdym połączeniem.
-n
Wyświetla adresy i numery portów w postaci liczbowej.
Wynik:
TCP 0.0.0.0:9999 0.0.0.0:0 LISTENING 15776
Następnie zakończ proces za pomocą PID
taskkill /F /PID 15776
/F
- Określa wymuszenie zakończenia procesu (ów).
Uwaga: możesz potrzebować dodatkowych uprawnień (uruchamianych od administratora), aby zabić niektóre procesy
Jeśli chcesz to zrobić programowo, możesz użyć niektórych opcji podanych w następujący sposób w skrypcie PowerShell:
$processPID = $($(netstat -aon | findstr "9999")[0] -split '\s+')[-1]
taskkill /f /pid $processPID
Jednak; pamiętaj, że im dokładniejszy możesz być, tym dokładniejszy będzie wynik PID. Jeśli wiesz, na którym hoście ma znajdować się port, możesz go bardzo zawęzić. netstat -aon | findstr "0.0.0.0:9999"
zwróci tylko jedną aplikację i najprawdopodobniej poprawną. Tylko wyszukanie numeru portu może spowodować zwrócenie procesów, które tylko się 9999
w nim znajdują, na przykład:
TCP 0.0.0.0:9999 0.0.0.0:0 LISTENING 15776
UDP [fe80::81ad:9999:d955:c4ca%2]:1900 *:* 12331
Najbardziej prawdopodobny kandydat zwykle kończy się jako pierwszy, ale jeśli proces zakończył się przed uruchomieniem skryptu, możesz zamiast tego otrzymać PID 12331 i zabić niewłaściwy proces.
Po trochę majstrowaniu przy scenariuszu doszedłem do tej akcji. Skopiuj i zapisz w pliku .bat:
FOR /F "usebackq tokens=5" %%i IN (`netstat -aon ^| find "3306"`) DO taskkill /F /PID %%i
Zmień „znajdź„ 3306 ”” w numerze portu, który musi być wolny. Następnie uruchom plik jako administrator. Zabije wszystkie procesy działające na tym porcie.
Komenda:
netstat -aon | findstr 4723
Wynik:
TCP 0.0.0.0:4723 0.0.0.0:0 LISTENING 10396
Teraz wytnij identyfikator procesu „10396”, używając for
polecenia w systemie Windows.
Komenda:
for /f "tokens=5" %a in ('netstat -aon ^| findstr 4723') do @echo %~nxa
Wynik:
10396
Jeśli chcesz wyciąć 4. cyfrę wartości oznacza „SŁUCHANIE”, a następnie wydaj polecenie w systemie Windows.
Komenda:
for /f "tokens=4" %a in ('netstat -aon ^| findstr 4723') do @echo %~nxa
Wynik:
SŁUCHAJĄCY
Pomaga to znaleźć PID za pomocą numeru portu.
lsof -i tcp:port_number
'lsof' is not recognized as an internal or external command.
Jednowierszowy PowerShell (zgodny z Core) ułatwiający tworzenie scenariuszy kopiowania:
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
Wynik:
ProcessName State Protocol AddressLocal AddressForeign
----------- ----- -------- ------------ --------------
System LISTENING TCP [::]:8080 [::]:0
System LISTENING TCP 0.0.0.0:8080 0.0.0.0:0
Ten sam kod, przyjazny dla programistów:
$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