Il mio servizio si blocca all'avvio con il classico:
java.rmi.server.ExportException: Listen failed on port: 9999
Come posso trovare il processo per ucciderlo?
Il mio servizio si blocca all'avvio con il classico:
java.rmi.server.ExportException: Listen failed on port: 9999
Come posso trovare il processo per ucciderlo?
Risposte:
Basta aprire una shell dei comandi e digitare (dicendo che la tua porta è 123456):
netstat -a -n -o | find "123456"
Vedrai tutto ciò di cui hai bisogno.
Le intestazioni sono:
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:37 0.0.0.0:0 LISTENING 1111
nestat -aon | findstr 123456
Trova il PID di un processo che utilizza una porta su Windows (es. Porta: "9999")
netstat -aon | find "9999"
-a
Visualizza tutte le connessioni e le porte di ascolto.
-o
Visualizza l'ID del processo proprietario associato a ciascuna connessione.
-n
Visualizza indirizzi e numeri di porta in formato numerico.
Produzione:
TCP 0.0.0.0:9999 0.0.0.0:0 LISTENING 15776
Quindi termina il processo con PID
taskkill /F /PID 15776
/F
- Specifica di terminare forzatamente il / i processo / i.
Nota: potrebbe essere necessaria un'autorizzazione aggiuntiva (eseguita dall'amministratore) per terminare alcuni determinati processi
Se si desidera eseguire questa operazione a livello di codice, è possibile utilizzare alcune delle opzioni fornite come segue in uno script di PowerShell:
$processPID = $($(netstat -aon | findstr "9999")[0] -split '\s+')[-1]
taskkill /f /pid $processPID
Però; essere consapevoli che più si può essere accurati, più preciso sarà il risultato PID. Se sai su quale host dovrebbe essere la porta, puoi restringerlo molto. netstat -aon | findstr "0.0.0.0:9999"
restituirà solo un'applicazione e molto probabilmente quella corretta. Solo la ricerca sul numero di porta può farti restituire processi che hanno solo 9999
in esso, come questo:
TCP 0.0.0.0:9999 0.0.0.0:0 LISTENING 15776
UDP [fe80::81ad:9999:d955:c4ca%2]:1900 *:* 12331
Il candidato più probabile di solito finisce per primo, ma se il processo è terminato prima di eseguire lo script, potresti finire con il PID 12331 e uccidere il processo sbagliato.
Dopo aver armeggiato con una sceneggiatura sono arrivato a questa azione. Copia e salvalo in un file .bat:
FOR /F "usebackq tokens=5" %%i IN (`netstat -aon ^| find "3306"`) DO taskkill /F /PID %%i
Cambia "trova" 3306 "" nel numero di porta che deve essere libero. Quindi esegui il file come amministratore. Ucciderà tutti i processi in esecuzione su questa porta.
Comando:
netstat -aon | findstr 4723
Produzione:
TCP 0.0.0.0:4723 0.0.0.0:0 LISTENING 10396
Ora taglia l'ID del processo, "10396", utilizzando il for
comando in Windows.
Comando:
for /f "tokens=5" %a in ('netstat -aon ^| findstr 4723') do @echo %~nxa
Produzione:
10396
Se vuoi tagliare il 4 ° numero del valore significa "ASCOLTO" allora comando in Windows.
Comando:
for /f "tokens=4" %a in ('netstat -aon ^| findstr 4723') do @echo %~nxa
Produzione:
ASCOLTANDO
Questo aiuta a trovare PID utilizzando il numero di porta.
lsof -i tcp:port_number
'lsof' is not recognized as an internal or external command.
One-liner PowerShell (compatibile con Core) per facilitare gli scenari di copypaste:
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
Produzione:
ProcessName State Protocol AddressLocal AddressForeign
----------- ----- -------- ------------ --------------
System LISTENING TCP [::]:8080 [::]:0
System LISTENING TCP 0.0.0.0:8080 0.0.0.0:0
Stesso codice, intuitivo per gli sviluppatori:
$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