Mi servicio se bloquea al iniciar con el clásico:
java.rmi.server.ExportException: Listen failed on port: 9999
¿Cómo puedo encontrar el proceso para matarlo?
Mi servicio se bloquea al iniciar con el clásico:
java.rmi.server.ExportException: Listen failed on port: 9999
¿Cómo puedo encontrar el proceso para matarlo?
Respuestas:
Simplemente abra un shell de comandos y escriba (diciendo que su puerto es 123456):
netstat -a -n -o | find "123456"
Verás todo lo que necesitas.
Los encabezados son:
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:37 0.0.0.0:0 LISTENING 1111
nestat -aon | findstr 123456
Busque el PID de un proceso que utiliza un puerto en Windows (por ejemplo, puerto: "9999")
netstat -aon | find "9999"
-a
Muestra todas las conexiones y puertos de escucha.
-o
Muestra el ID del proceso propietario asociado con cada conexión.
-n
Muestra direcciones y números de puerto en forma numérica.
Salida:
TCP 0.0.0.0:9999 0.0.0.0:0 LISTENING 15776
Luego mata el proceso por PID
taskkill /F /PID 15776
/F
- Especifica terminar forzosamente el (los) proceso (s).
Nota: es posible que necesite un permiso adicional (ejecutado por el administrador) para eliminar algunos procesos determinados
Si desea hacer esto mediante programación, puede usar algunas de las opciones que se le brindan de la siguiente manera en un script de PowerShell:
$processPID = $($(netstat -aon | findstr "9999")[0] -split '\s+')[-1]
taskkill /f /pid $processPID
Sin embargo; tenga en cuenta que cuanto más preciso pueda ser, más preciso será el resultado de su PID. Si sabe en qué host se supone que está el puerto, puede reducirlo mucho. netstat -aon | findstr "0.0.0.0:9999"
solo devolverá una aplicación y muy probablemente la correcta. Solo buscar el número de puerto puede hacer que devuelva procesos que solo tienen 9999
, como este:
TCP 0.0.0.0:9999 0.0.0.0:0 LISTENING 15776
UDP [fe80::81ad:9999:d955:c4ca%2]:1900 *:* 12331
El candidato más probable suele terminar primero, pero si el proceso ha finalizado antes de ejecutar el script, puede terminar con el PID 12331 y eliminar el proceso incorrecto.
Después de jugar un poco con un guión llegué a esta acción. Cópielo y guárdelo en un archivo .bat:
FOR /F "usebackq tokens=5" %%i IN (`netstat -aon ^| find "3306"`) DO taskkill /F /PID %%i
Cambie 'find "3306"' en el número de puerto que debe estar libre. Luego ejecute el archivo como administrador. Matará todos los procesos que se ejecutan en este puerto.
Mando:
netstat -aon | findstr 4723
Salida:
TCP 0.0.0.0:4723 0.0.0.0:0 LISTENING 10396
Ahora corte el ID de proceso, "10396", usando el for
comando en Windows.
Mando:
for /f "tokens=5" %a in ('netstat -aon ^| findstr 4723') do @echo %~nxa
Salida:
10396
Si desea cortar el cuarto número del valor significa "ESCUCHAR", entonces comando en Windows.
Mando:
for /f "tokens=4" %a in ('netstat -aon ^| findstr 4723') do @echo %~nxa
Salida:
ESCUCHANDO
Esto ayuda a encontrar PID usando el número de puerto.
lsof -i tcp:port_number
'lsof' is not recognized as an internal or external command.
PowerShell (compatible con Core) de una sola línea para facilitar los escenarios de copiar y pegar:
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
Salida:
ProcessName State Protocol AddressLocal AddressForeign
----------- ----- -------- ------------ --------------
System LISTENING TCP [::]:8080 [::]:0
System LISTENING TCP 0.0.0.0:8080 0.0.0.0:0
Mismo código, amigable para desarrolladores:
$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