Mon service plante au démarrage avec le classique:
java.rmi.server.ExportException: Listen failed on port: 9999
Comment puis-je trouver le processus pour le tuer?
Mon service plante au démarrage avec le classique:
java.rmi.server.ExportException: Listen failed on port: 9999
Comment puis-je trouver le processus pour le tuer?
Réponses:
Ouvrez simplement un shell de commande et tapez (en disant que votre port est 123456):
netstat -a -n -o | find "123456"
Vous verrez tout ce dont vous avez besoin.
Les en-têtes sont:
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:37 0.0.0.0:0 LISTENING 1111
nestat -aon | findstr 123456
Trouvez le PID d'un processus qui utilise un port sous Windows (par exemple le port: "9999")
netstat -aon | find "9999"
-a
Affiche toutes les connexions et tous les ports d'écoute.
-o
Affiche l'ID de processus propriétaire associé à chaque connexion.
-n
Affiche les adresses et les numéros de port sous forme numérique.
Production:
TCP 0.0.0.0:9999 0.0.0.0:0 LISTENING 15776
Puis tuez le processus par PID
taskkill /F /PID 15776
/F
- Spécifie de forcer l'arrêt du ou des processus.
Remarque: vous aurez peut-être besoin d'une autorisation supplémentaire (exécutée par l'administrateur) pour tuer certains processus
Si vous souhaitez effectuer cette opération par programme, vous pouvez utiliser certaines des options qui vous sont proposées comme suit dans un script PowerShell:
$processPID = $($(netstat -aon | findstr "9999")[0] -split '\s+')[-1]
taskkill /f /pid $processPID
Toutefois; sachez que plus vous pouvez être précis, plus votre résultat PID sera précis. Si vous savez sur quel hôte le port est censé se trouver, vous pouvez le réduire beaucoup. netstat -aon | findstr "0.0.0.0:9999"
ne renverra qu'une seule application et très probablement la bonne. Seule la recherche sur le numéro de port peut vous amener à renvoyer des processus qui ne s'y trouvent 9999
que:
TCP 0.0.0.0:9999 0.0.0.0:0 LISTENING 15776
UDP [fe80::81ad:9999:d955:c4ca%2]:1900 *:* 12331
Le candidat le plus probable finit généralement en premier, mais si le processus s'est terminé avant d'exécuter votre script, vous risquez de vous retrouver avec le PID 12331 à la place et de tuer le mauvais processus.
Après quelques manipulations avec un script, je suis arrivé à cette action. Copiez-le et enregistrez-le dans un fichier .bat:
FOR /F "usebackq tokens=5" %%i IN (`netstat -aon ^| find "3306"`) DO taskkill /F /PID %%i
Modifiez 'find "3306"' dans le numéro de port qui doit être libre. Exécutez ensuite le fichier en tant qu'administrateur. Cela tuera tous les processus en cours d'exécution sur ce port.
Commander:
netstat -aon | findstr 4723
Production:
TCP 0.0.0.0:4723 0.0.0.0:0 LISTENING 10396
Maintenant, coupez l'ID de processus, "10396", à l'aide de la for
commande sous Windows.
Commander:
for /f "tokens=5" %a in ('netstat -aon ^| findstr 4723') do @echo %~nxa
Production:
10396
Si vous voulez couper le 4ème chiffre de la valeur signifie "ECOUTER" alors commande sous Windows.
Commander:
for /f "tokens=4" %a in ('netstat -aon ^| findstr 4723') do @echo %~nxa
Production:
ÉCOUTE
Cela aide à trouver le PID à l'aide du numéro de port.
lsof -i tcp:port_number
'lsof' is not recognized as an internal or external command.
PowerShell (compatible Core) One-Liner pour faciliter les scénarios 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
Production:
ProcessName State Protocol AddressLocal AddressForeign
----------- ----- -------- ------------ --------------
System LISTENING TCP [::]:8080 [::]:0
System LISTENING TCP 0.0.0.0:8080 0.0.0.0:0
Même code, convivial pour les développeurs:
$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