54 votes

Comment tuer un processus qui est mort mais qui écoute ?

Je développe une application qui écoute sur le port 3000. Apparemment, il y a une instance de cette application qui écoute toujours ce port, car à chaque fois que je la lance, elle ne peut pas créer d'écouteur (C#, TcpListener, mais ce n'est pas pertinent) parce que le port est déjà pris.

L'application n'existe pas dans le gestionnaire de tâches, j'ai donc essayé de trouver son PID et de la tuer, ce qui a donné ce résultat intéressant :

C:\Users\username>netstat -o -n -a | findstr 0.0:3000
   TCP    0.0.0.0:3000           0.0.0.0:0              LISTENING       3116

C:\Users\username>taskkill /F /PID 3116
ERROR: The process "3116" not found.

Je n'ai jamais vu ce comportement auparavant et j'ai pensé que c'était suffisamment intéressant pour voir si quelqu'un avait une solution.

MISE À JOUR : J'ai lancé l'Explorateur de processus et j'ai fait une recherche pour 3000 et j'ai trouvé ceci :

<Non-existent Process>(3000): 5552

J'ai fait un clic droit dessus et choisi "Fermer la poignée". Il n'est plus dans l'explorateur de processus, mais apparaît toujours dans netstat et empêche toujours l'application de lancer le listener.

UPDATE 2 : Trouvé TCPView pour Windows qui montrent le processus comme "<non-existent>" . Comme avec CurrPorts, rien ne se passe lorsque j'essaie de fermer la connexion dans cet outil.

4voto

MSE Points 141

J'ai vu un problème similaire lorsque la cause fondamentale était un processus enfant créé héritant des ports, le processus parent s'est écrasé, alors que le processus enfant détenait toujours le port. La solution consistait à identifier le processus enfant toujours en cours d'exécution et à l'arrêter. Dans cet exemple, le PID du processus non existant était 7336.

> wmic process get processid,parentprocessid | findstr/i 7336
7336             23828

Pour arrêter ce processus :

> taskkill /f /pid 23828

Et cela a résolu le problème.

1voto

Reinout van Rees Points 160

Pouvez-vous voir le processus dans Explorateur de processus ? Si oui, vous pouvez le tuer à partir de là, mais seulement après avoir examiné ce qu'il est réellement (vous pouvez voir toutes les dll chargées dans le processus).

1voto

bjunix Points 140

Essayez d'ajouter l'option '-b' à votre commande netstat. Elle vous indiquera le nom de l'exécutable qui utilise le port. Trouvez ensuite ce processus dans le gestionnaire de tâches et tuez-le. Si cela ne fonctionne pas, indiquez quel est l'exécutable qui maintient le port ouvert.

1voto

Andreas Points 1393

Il est nécessaire de mentionner le terme s'attarder ici.

Les détails peuvent être trouvés sur le site http://msdn.microsoft.com/en-us/library/ms739165.aspx

En bref : Il y a une option qui indique au système de socket de garder un socket ouvert même après qu'il ait été fermé si des données non envoyées sont présentes.

Dans votre application C#, vous pouvez spécifier toutes les options connexes via Socket.SetSocketOption : http://msdn.microsoft.com/en-us/library/1011kecd.aspx

Comme tout ce qui est mentionné est lié à l'envoi et aux clients, mais que nous avions des problèmes similaires au travail, une recherche plus poussée a révélé que l'on pouvait spécifier l'option linger pour les auditeurs comme indiqué dans l'exemple ici : http://msdn.microsoft.com/library/system.net.sockets.tcplistener.server.aspx

Certains collègues ont parlé de ports retenus par le système d'exploitation après la fin/fermeture de l'application pendant environ deux minutes. Compte tenu de cela, il serait intéressant de savoir si le port est toujours retenu après un certain laps de temps.

1voto

Mike Venzke Points 434

Je rencontre également ce problème. J'ai finalement trouvé la raison. C'est dû au fait que le processus principal invoque un processus enfant par popen en c/c++. Mais le processus principal s'est écrasé/éteint avant d'invoquer pclose. Alors le port traitera le processus principal comme étant toujours vivant et continuera à l'écouter.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X