Meu serviço travou na inicialização com o clássico:
java.rmi.server.ExportException: Listen failed on port: 9999
Como posso encontrar o processo para eliminá-lo?
Meu serviço travou na inicialização com o clássico:
java.rmi.server.ExportException: Listen failed on port: 9999
Como posso encontrar o processo para eliminá-lo?
Respostas:
Basta abrir um shell de comando e digitar (dizendo que sua porta é 123456):
netstat -a -n -o | find "123456"
Você verá tudo que você precisa.
Os cabeçalhos são:
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:37 0.0.0.0:0 LISTENING 1111
nestat -aon | findstr 123456
Encontre o PID de um processo que usa uma porta no Windows (por exemplo, porta: "9999")
netstat -aon | find "9999"
-a
Exibe todas as conexões e portas de escuta.
-o
Exibe o ID do processo proprietário associado a cada conexão.
-n
Exibe endereços e números de porta em formato numérico.
Resultado:
TCP 0.0.0.0:9999 0.0.0.0:0 LISTENING 15776
Em seguida, elimine o processo por PID
taskkill /F /PID 15776
/F
- Especifica o encerramento forçado do (s) processo (s).
Nota: Você pode precisar de uma permissão extra (executar do administrador) para encerrar alguns processos
Se quiser fazer isso programaticamente, você pode usar algumas das opções fornecidas a você da seguinte maneira em um script do PowerShell:
$processPID = $($(netstat -aon | findstr "9999")[0] -split '\s+')[-1]
taskkill /f /pid $processPID
Contudo; esteja ciente de que quanto mais preciso você for, mais preciso será o resultado do PID. Se você souber em qual host a porta deve estar, você pode restringi-la muito. netstat -aon | findstr "0.0.0.0:9999"
retornará apenas um aplicativo e, provavelmente, o correto. Apenas pesquisar o número da porta pode fazer com que você retorne processos que apenas possuem 9999
nele, como este:
TCP 0.0.0.0:9999 0.0.0.0:0 LISTENING 15776
UDP [fe80::81ad:9999:d955:c4ca%2]:1900 *:* 12331
O candidato mais provável geralmente termina primeiro, mas se o processo terminou antes de você executar o script, você pode acabar com o PID 12331 e encerrar o processo errado.
Depois de mexer em um script, cheguei a esta ação. Copie e salve em um arquivo .bat:
FOR /F "usebackq tokens=5" %%i IN (`netstat -aon ^| find "3306"`) DO taskkill /F /PID %%i
Altere 'find "3306"' no número da porta que precisa ser livre. Em seguida, execute o arquivo como administrador. Isso vai matar todos os processos em execução nesta porta.
Comando:
netstat -aon | findstr 4723
Resultado:
TCP 0.0.0.0:4723 0.0.0.0:0 LISTENING 10396
Agora corte o ID do processo, "10396", usando o for
comando no Windows.
Comando:
for /f "tokens=5" %a in ('netstat -aon ^| findstr 4723') do @echo %~nxa
Resultado:
10396
Se você quiser cortar o 4º número do valor significa "LISTENING", então o comando no Windows.
Comando:
for /f "tokens=4" %a in ('netstat -aon ^| findstr 4723') do @echo %~nxa
Resultado:
OUVINDO
Isso ajuda a encontrar o PID usando o número da porta.
lsof -i tcp:port_number
'lsof' is not recognized as an internal or external command.
PowerShell (compatível com Core) one-liner para facilitar os cenários de 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
Resultado:
ProcessName State Protocol AddressLocal AddressForeign
----------- ----- -------- ------------ --------------
System LISTENING TCP [::]:8080 [::]:0
System LISTENING TCP 0.0.0.0:8080 0.0.0.0:0
Mesmo código, amigável ao desenvolvedor:
$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