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.

1voto

V15I0N Points 143

Le problème peut être causé si le processus mort a démarré un ou plusieurs processus enfants. Si

BOOL WINAPI CreateProcess(
_In_opt_    LPCTSTR               lpApplicationName,
_Inout_opt_ LPTSTR                lpCommandLine,
_In_opt_    LPSECURITY_ATTRIBUTES lpProcessAttributes,
_In_opt_    LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_        BOOL                  bInheritHandles,
_In_        DWORD                 dwCreationFlags,
_In_opt_    LPVOID                lpEnvironment,
_In_opt_    LPCTSTR               lpCurrentDirectory,
_In_        LPSTARTUPINFO         lpStartupInfo,
_Out_       LPPROCESS_INFORMATION lpProcessInformation
);

a été utilisé pour démarrer un processus enfant, il dépend de la valeur des handles inherit, donc avec

bInheritHandles = false 

Windows ne bloquera pas le port si le processus parent est arrêté et que le processus client est toujours en cours d'exécution.

0voto

Matías Points 3008

Je suppose que vous n'avez pas installé de pare-feu (ou que vous n'avez pas essayé les astuces de mise en réseau de Windows) ?

Certains pare-feu ont ce genre de comportement et peuvent garder des ports ouverts.

Si vous en avez un, essayez de le désactiver, puis de lancer votre programme et de le fermer pour voir ce qui se passe.

0voto

John Xiao Points 181

Puisque votre processus est listé comme System, vous pouvez probablement le tuer à l'aide d'une commande "System". Le compte Système a plus de privilèges qu'un administrateur ordinaire.

Vous pouvez obtenir cmd.exe "System" en planifiant une tâche pour cmd.exe (le planificateur s'exécute en tant que System) :

at 15:23 /interactive "cmd.exe" 

Changez ce temps pour quelque chose dans un avenir proche. Assurez-vous également que vous êtes sur la console de la machine (si vous êtes sur une session normale de serveur terminal, vous ne verrez pas le nouveau cmd.exe. Faites mstsc connexion à la console). Je suppose qu'il y a d'autres façons de faire, mais cela a fonctionné pour moi dans le passé.

0voto

pxl Points 981

J'ai eu le même problème avec xdebug, il a laissé le port 9000 ouvert.

J'ai réussi à fermer avec cmd en utilisant "taskkill /pid xxxx".

Le pid du processus utilisant le port peut être récupéré avec "netstat -o".

Ma configuration était win 7 home premium.

0voto

gpvos Points 123

J'ai eu le même problème. Le processus était en train d'être débogué pendant qu'il se plantait, et il y avait toujours un processus vsjitdebugger.exe dans un état suspendu qui traînait, qui apparemment faisait référence au processus en train d'être débogué. En tuant ce processus vsjitdebugger.exe, le problème a été résolu.

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