Mein Service stürzt beim Start mit dem Klassiker ab:
java.rmi.server.ExportException: Listen failed on port: 9999
Wie finde ich den Prozess, um es zu töten?
Mein Service stürzt beim Start mit dem Klassiker ab:
java.rmi.server.ExportException: Listen failed on port: 9999
Wie finde ich den Prozess, um es zu töten?
Antworten:
Öffnen Sie einfach eine Befehlsshell und geben Sie ein (sagen Sie, Ihr Port ist 123456):
netstat -a -n -o | find "123456"
Sie werden alles sehen, was Sie brauchen.
Die Überschriften sind:
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:37 0.0.0.0:0 LISTENING 1111
nestat -aon | findstr 123456
Suchen Sie die PID eines Prozesses, der unter Windows einen Port verwendet (z. B. Port: "9999").
netstat -aon | find "9999"
-a
Zeigt alle Verbindungen und Überwachungsports an.
-o
Zeigt die jeder Verbindung zugeordnete Prozess-ID an.
-n
Zeigt Adressen und Portnummern in numerischer Form an.
Ausgabe:
TCP 0.0.0.0:9999 0.0.0.0:0 LISTENING 15776
Beenden Sie dann den Prozess per PID
taskkill /F /PID 15776
/F
- Gibt an, dass die Prozesse zwangsweise beendet werden sollen.
Hinweis: Möglicherweise benötigen Sie eine zusätzliche Berechtigung (vom Administrator ausgeführt), um bestimmte Prozesse abzubrechen
Wenn Sie dies programmgesteuert ausführen möchten, können Sie einige der folgenden Optionen in einem PowerShell-Skript wie folgt verwenden:
$processPID = $($(netstat -aon | findstr "9999")[0] -split '\s+')[-1]
taskkill /f /pid $processPID
Jedoch; Beachten Sie, dass Ihr PID-Ergebnis umso genauer ist, je genauer Sie sein können. Wenn Sie wissen, auf welchem Host sich der Port befinden soll, können Sie ihn erheblich eingrenzen. netstat -aon | findstr "0.0.0.0:9999"
gibt nur eine Anwendung zurück und höchstwahrscheinlich die richtige. Nur die Suche nach der Portnummer kann dazu führen, dass Sie Prozesse zurückgeben, die nur zufällig darin enthalten sind 9999
:
TCP 0.0.0.0:9999 0.0.0.0:0 LISTENING 15776
UDP [fe80::81ad:9999:d955:c4ca%2]:1900 *:* 12331
Der wahrscheinlichste Kandidat landet normalerweise zuerst, aber wenn der Prozess beendet ist, bevor Sie Ihr Skript ausführen, erhalten Sie möglicherweise stattdessen die PID 12331 und beenden den falschen Prozess.
Nach einigem Fummeln mit einem Skript kam ich zu dieser Aktion. Kopieren und speichern Sie es in einer .bat-Datei:
FOR /F "usebackq tokens=5" %%i IN (`netstat -aon ^| find "3306"`) DO taskkill /F /PID %%i
Ändern Sie 'find "3306"' in der Portnummer, die frei sein muss. Führen Sie dann die Datei als Administrator aus. Alle Prozesse, die an diesem Port ausgeführt werden, werden abgebrochen.
Befehl:
netstat -aon | findstr 4723
Ausgabe:
TCP 0.0.0.0:4723 0.0.0.0:0 LISTENING 10396
Schneiden Sie nun die Prozess-ID "10396" mit dem for
Befehl in Windows aus.
Befehl:
for /f "tokens=5" %a in ('netstat -aon ^| findstr 4723') do @echo %~nxa
Ausgabe:
10396
Wenn Sie die 4. Zahl abschneiden möchten, bedeutet der Wert "HÖREN", dann Befehl in Windows.
Befehl:
for /f "tokens=4" %a in ('netstat -aon ^| findstr 4723') do @echo %~nxa
Ausgabe:
HÖREN
Dies hilft, die PID anhand der Portnummer zu finden.
lsof -i tcp:port_number
'lsof' is not recognized as an internal or external command.
PowerShell (Core-kompatibel) Einzeiler zur Vereinfachung von Copypaste-Szenarien:
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
Ausgabe:
ProcessName State Protocol AddressLocal AddressForeign
----------- ----- -------- ------------ --------------
System LISTENING TCP [::]:8080 [::]:0
System LISTENING TCP 0.0.0.0:8080 0.0.0.0:0
Gleicher Code, entwicklerfreundlich:
$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