92 votes

Comment libérer un port bloqué par un processus mort ?

Un de mes collègues a récemment rencontré un problème où un processus qui était censé avoir été arrêté était toujours lié à un port réseau, empêchant d'autres processus de se lier à ce port. Plus précisément, netstat -a -b signalait qu'un processus nommé System avec le PID 4476 occupait le port 60001, sauf qu'aucun processus avec le PID 4476 n'existait, du moins autant que je pouvais en juger.

Process Explorer et le Gestionnaire des tâches ne listait pas le PID 4476 (bien qu'il y ait un autre processus nommé System avec le PID 4, qui avait son propre ensemble de connexions TCP qui n'incluait pas 60001). taskkill /PID 4476 a également signalé que le PID 4476 n'a pas pu être trouvé.

Y a-t-il un moyen de tuer ce mystérieux processus System pour libérer le port auquel il est actuellement lié? Qu'est-ce qui peut causer cela? Comment peut-il y avoir des processus que ni le Gestionnaire des tâches, ni Process Explorer, ni taskkill ne connaissent? Redémarrer a permis de résoudre le problème, mais j'aimerais savoir s'il existe un moyen de résoudre cela sans redémarrer.

0 votes

Combien de temps avez-vous attendu pour voir si le port a été libéré? Dans quel état était la connexion (port)? Établi, Fermé, Time_Wait?

0 votes

@joeqwerty: Nous avons attendu au moins 15-20 minutes. Malheureusement, j'ai oublié dans quel état était la connexion =/.

0 votes

20 minutes semble être un problème. La prochaine fois qu'il se produit, exécutez netstat et vérifiez l'état de la connexion, cela vous donnera une indication de ce qui se passe. Comme vous l'avez commenté dans la réponse de mfinni, cela peut être le résultat d'un plantage de votre logiciel\service.

77voto

Ogapo Points 831

Je sais que c'est un vieux fil de discussion, mais au cas où quelqu'un d'autre rencontre le même problème, j'avais...

Ce qui se passe probablement est que votre processus avait un port TCP ouvert lorsqu'il a crashé ou s'est arrêté sans le fermer explicitement. Normalement, le système d'exploitation nettoie ce genre de choses, mais seulement lorsque l'enregistrement du processus disparaît. Bien que le processus ne semble plus être en cours d'exécution, il y a au moins une chose qui peut garder un enregistrement autour, afin d'empêcher la réutilisation de son PID. Il s'agit de l'existence d'un processus enfant qui n'est pas détaché du parent.

Si votre programme a créé des processus pendant son exécution, essayez de les tuer. Cela devrait libérer l'enregistrement du processus et nettoyer le port TCP. Apparemment, Windows ne le fait pas lorsque le processus se termine, comme je l'aurais pensé, mais lorsque l'enregistrement est libéré.

1 votes

Merci, Monsieur. Je ne peux pas croire que cette réponse soit si basse, surtout depuis que la requête google est remplie de réponses "utiliser TCPView/utiliser netstat & taskkill" qui n'aident pas dans ce cas. Dans mon cas, ce qui a aidé était d'exécuter ProcessExplorer et de chercher tout processus qui avait été abandonné. Les arrêter a résolu le problème.

3 votes

Merci pour votre conseil !! Tuer le processus orphelin a vraiment résolu le problème.

0 votes

Merci !! C'était exactement ce qui m'était arrivé. J'ai tué le processus orphelin et le port a été libéré. Je ne sais pas comment rechercher des processus orphelins en utilisant l'explorateur de processus, mais je connaissais les noms des processus qui étaient créés donc c'était facile à trouver.

15voto

davidbuzatto Points 5148

Ouvrez l'invite de commandes en tant qu'administrateur

  1. C:\WINDOWS\system32>netstat -ano | findstr :7895

*** Répétez l'étape 2 jusqu'à ce qu'il n'y ait plus de processus enfants

  1. C:\WINDOWS\system32>wmic process where (ParentProcessId=1091 ) get Caption,ProcessId

    Caption ProcessId

    cmd.exe 1328

2.a. C:\WINDOWS\system32>wmic process where (ParentProcessId=1328) get Caption,ProcessId

  Caption  ProcessId

  conhost.exe  1128

2.b. répétez ceci jusqu'à ce qu'il n'y ait plus de processus enfants

-- Ensuite, tuez tous les processus enfants

  1. C:\WINDOWS\system32>taskkill /F /PID 1128 SUCCESS: Le processus avec PID 9500 a été arrêté.

0 votes

La commande wmic était le seul moyen que nous avons trouvé pour identifier le processus enfant qui gardait effectivement nos ports ouverts. Merci beaucoup.

0 votes

C'était aussi le seul moyen que j'ai trouvé pour résoudre mon problème. Le processus principal avait disparu et le processus enfant était dans un état suspendu, mais continuait de maintenir le port TCP avec un état "Écoute". Merci.

7voto

mfinni Points 35332

Avez-vous essayé d'utiliser TCPView et de fermer la connexion? Je ne sais pas si cela montrera la connexion dans le scénario que vous décrivez, car cela ne m'est jamais arrivé. Mais c'est la seule chose à laquelle je peux penser si cela se reproduit à nouveau.

Quel était le processus - était-ce un logiciel commercial ou quelque chose de fait maison? Il semble que le port 60001 soit utilisé par certains Trojans - je me demande s'il pourrait s'agir d'un rootkit ou quelque chose qui pourrait se cacher de l'OS? Il pourrait être judicieux de passer en revue cette machine avec un antivirus, peut-être quelque chose à partir d'un support bootable.

0 votes

Non, nous n'avons pas essayé TCPView; je vais m'en souvenir pour l'avenir si cela se reproduit. Le logiciel est notre logiciel interne qui utilise le port 60001 -- Je suis presque certain que le processus qui maintenait le port ouvert était une instance précédente de notre logiciel qui n'était pas tout à fait complètement arrêtée. Cela a empêché une autre copie du logiciel de démarrer.

0 votes

Votre application peut définir l'option SO_REUSEADDR du socket sur vrai avant de le lier. Cela devrait résoudre votre problème (c'est même plus ou moins obligatoire sur *nix).

1voto

Elavarasi Points 11

J'ai déjà rencontré le même problème auparavant, la commande netstat -a -n sous Windows m'a donné la liste des ports ouverts avec l'identifiant du processus. À partir de là, j'ai sélectionné le numéro de port que je voulais fermer la connexion et j'ai fermé cette connexion en utilisant le logiciel TCPView. Cela a fonctionné pour moi.

-4voto

user314053 Points 1

Si vous êtes un utilisateur de Windows, suivez les étapes ci-dessous

Étape 1 : Allez dans ce chemin : Panneau de configuration\Tous les éléments du Panneau de configuration\Outils d'administration

Étape 2 : Cliquez sur Services

Étape 3 : Arrêtez les services non désirés s'exécutant sur le port souhaité.

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