web-dev-qa-db-fra.com

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

Un de mes collègues a récemment rencontré un problème où un processus qui était censé être mort é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 PID 4476 avait le port 60001 ouvert, sauf qu'aucun processus avec PID 4476 n'existait, du moins pour autant que je sache.

L'Explorateur de processus et le Gestionnaire des tâches n'ont pas répertorié le PID 4476 (bien qu'il y ait un autre processus nommé System avec PID 4, qui avait son propre ensemble de TCP qui n'incluaient pas 60001) . taskkill /PID 4476 a également indiqué que le PID 4476 était introuvable.

Existe-t-il un moyen de tuer ce mystérieux processus système pour libérer le port auquel il est actuellement lié? Qu'est-ce qui peut provoquer cela? Comment peut-il y avoir des processus dont aucun gestionnaire des tâches, Explorateur de processus et taskkill ne connaissent? Le redémarrage a réussi à résoudre le problème, mais j'aimerais savoir s'il existe un moyen de résoudre ce problème sans redémarrer.

70
Adam Rosenfield

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

Ce qui peut arriver, c'est que votre processus avait un TCP ouvert quand il s'est écrasé ou autrement fermé sans le fermer explicitement. Normalement, le système d'exploitation nettoie ce genre de choses, mais uniquement lorsque l'enregistrement de processus disparaît Bien que le processus ne semble plus fonctionner, il y a au moins une chose qui peut en garder trace, afin d'empêcher la réutilisation de son PID. Il s'agit de l'existence d'un processus enfant non détaché. du parent.

Si votre programme a généré des processus pendant son exécution, essayez de les tuer. Cela devrait entraîner la libération de son enregistrement de processus et le nettoyage du port TCP. Apparemment, Windows le fait lorsque l'enregistrement est libéré et non lorsque le processus se termine comme je m'y attendais.

60
Ogapo

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 je ne suis jamais arrivé à cela. Mais c'est la seule chose à laquelle je peux penser si cela se reproduit.

Quel était le processus - était-ce un logiciel commercial ou quelque chose de local? Il semble que le port 60001 soit utilisé par certains chevaux de Troie - je me demande si cela aurait pu être un rootkit ou quelque chose qui pourrait se cacher du système d'exploitation? Pourrait vouloir donner à cette machine une bonne fois avec AV, peut-être quelque chose à partir d'un support de démarrage.

6
mfinni

Ouvrir 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 enfant

  1. C:\WINDOWS\system32> processus wmic où (ParentProcessId = 1091) obtient Caption, ProcessId

    Légende ProcessId

    cmd.exe 1328

2.a. C:\WINDOWS\system32> processus wmic où (ParentProcessId = 1328) obtient Caption, ProcessId

  Caption  ProcessId

  conhost.exe  1128

2.b. répéter jusqu'à ce qu'aucun autre processus enfant ne soit trouvé

- Ensuite, tuez tous les processus enfants

  1. C:\WINDOWS\system32> taskkill/F/PID 1128 SUCCÈS: Le processus avec PID 9500 a été terminé.
6
Srinivas

J'ai rencontré le même problème plus tôt, la commande windows netstat -a -n m'a donné la liste des ports ouverts avec l'ID de processus. De là, j'ai pris le numéro de port que je voulais fermer la connexion, puis j'ai fermé cette connexion en utilisant le logiciel TCPView. Cela a fonctionné pour moi.

1
Elavarasi