Frage Wie befreit man einen Port, der von einem toten Prozess offengehalten wird?


Ein Kollege von mir ist kürzlich auf ein Problem gestoßen, bei dem ein Prozess, der angeblich gestorben war, immer noch an einen Netzwerkanschluss gebunden war und andere Prozesse daran hinderten, sich an diesen Port zu binden. Speziell, netstat -a -b berichtete, dass ein Prozess benannt wurde System mit PID 4476 hatte Port 60001 offen, außer dass kein Prozess mit PID 4476 existierte, zumindest soweit ich das beurteilen konnte.

Process Explorer und Task-Manager listeten PID 4476 nicht auf (obwohl ein anderer Prozess benannt wurde System mit PID 4, das seine eigenen TCP-Verbindungen hatte, die 60001 nicht enthielten). taskkill /PID 4476 berichteten auch, dass PID 4476 nicht gefunden werden konnte.

Gibt es eine Möglichkeit, diesen mysteriösen Systemprozess zu beenden, um den Port freizugeben, an den er gerade gebunden ist? Was kann dazu führen, dass dies geschieht? Wie kann es Prozesse geben, von denen kein Task Manager, Process Explorer und Taskkill nichts wissen? Neustart hat es geschafft, das Problem zu beheben, aber ich würde gerne wissen, ob es eine Möglichkeit gibt, dies ohne Neustart zu beheben.


49
2017-09-14 14:35


Ursprung


Wie lange hast du gewartet, um zu sehen, ob der Port freigegeben wurde? In welchem ​​Zustand war die Verbindung (Port)? Gegründet, geschlossen, Time_Wait? - joeqwerty
@joeqwerty: Wir haben mindestens 15-20 Minuten gewartet. Leider habe ich vergessen, in welchem ​​Zustand die Verbindung war = /. - Adam Rosenfield
20 Minuten klingt wie ein Problem. Wenn es das nächste Mal auftritt, führen Sie netstat aus und überprüfen Sie den Status der Verbindung, damit Sie eine Ahnung haben, was passiert. Wie Sie zu Mfinnis Antwort kommentiert haben, kann dies auf den Absturz Ihrer Software \ service zurückzuführen sein. - joeqwerty


Antworten:


Ich weiß, das ist ein alter Faden, aber falls jemand das gleiche Problem hat, hatte ich ...

Was passiert, ist, dass Ihr Prozess einen TCP-Port geöffnet hat, wenn er abgestürzt oder anderweitig beendet wurde, ohne ihn explizit zu schließen. Normalerweise räumt das Betriebssystem solche Dinge auf, aber nur wenn der Prozessdatensatz verschwindet. Während der Prozess möglicherweise nicht mehr ausgeführt wird, gibt es mindestens eine Sache, die eine Aufzeichnung von es herum speichern kann, um Wiederverwendung seiner PID zu verhindern. Dies ist die Existenz eines Kindprozesses, der nicht vom Elternteil getrennt ist.

Wenn dein Programm während der Ausführung irgendwelche Prozesse hervorgebracht hat, versuche sie zu töten. Das sollte dazu führen, dass der Prozessdatensatz freigegeben und der TCP-Port bereinigt wird. Anscheinend tut Windows dies, wenn der Datensatz freigegeben wird, nicht wenn der Prozess beendet wird, wie ich es erwartet hätte.


54
2018-05-25 18:18



Danke, guter Herr. Ich kann nicht glauben, dass diese Antwort so niedrig ist, besonders da die Google-Abfrage mit Antworten gefüllt ist: "TCPView verwenden / netstat & taskkill verwenden", die in diesem Fall nicht helfen. In meinem Fall half es, den ProcessExplorer auszuführen und nach einem Prozess zu suchen, der verwaist war. Das Herunterfahren löste das Problem. - gwiazdorrr
Danke für deinen Hinweis !! Der Orphand-Prozess hat das Problem wirklich gelöst. - Darkthread
Vielen Dank!! Genau das war mir passiert. Ich tötete den verwaisten Prozess und der Port wurde freigegeben. Ich bin mir nicht sicher, wie ich mit Process Explorer nach verwaisten Prozessen suchen kann, aber ich kannte die Namen der Prozesse, die erzeugt wurden, so dass sie leicht zu finden waren. - Grezzo
Wir hatten das gleiche Problem - und mit Process Explorer sah, dass Dr. Watson hielt die alte PID. Wir suchten (Find) nach dem Port, den der Dienst zu öffnen versuchte, und sahen dann 3-4 Einträge für Dr. Watson und die von ihm verwendete PID. Seltsamerweise mussten wir nichts implizit TÖTEN. Scheint so, als ob dieser Prozess ihn "aufgeweckt" hätte und er verschwand. Als wir das nächste Mal versuchten, den Dienst neu zu starten, kam es gut an. - tresstylez
Ein ähnliches Problem kann beim Debuggen mit VS auftreten. Ich bin an VS gebunden, um zu verarbeiten, und nach einigen Zyklen - beschriebene Situation passiert, aber keine meiner Prozesse (einschließlich Kinder). Aber das Töten von "vsjitdebugger" hilft. - Dmitry Azaraev


Haben Sie versucht, TCPView zu verwenden und die Verbindung zu schließen? Ich weiß nicht, ob es die Verbindung in dem Szenario zeigt, das du beschreibst, weil mir das nie passiert ist. Aber es ist das einzige, woran ich denken kann, wenn das wieder passiert.

Was war der Prozess - war es kommerzielle Software oder etwas Eigengewächs? Es scheint, dass Port 60001 von einigen Trojanern verwendet wird - ich frage mich, ob es ein Rootkit oder etwas gewesen sein könnte, das sich vor dem Betriebssystem verstecken könnte? Vielleicht möchte ich diese Maschine mit AV, vielleicht etwas von bootfähigen Medien ein gutes einmal geben.


6
2017-09-14 14:47



Nein, wir haben TCPView nicht getestet. Ich werde das für die Zukunft im Hinterkopf behalten, wenn es jemals wieder passiert. Die Software ist unsere Inhouse-Software, die Port 60001 verwendet - ich bin mir fast sicher, dass der Prozess, der den Port offen hält, eine frühere Instanz unserer Software war, die irgendwie nicht vollständig abstürzte. Das verhinderte das Starten einer anderen Kopie der Software. - Adam Rosenfield
Ihre Anwendung kann die SO_REUSEADDR-Option des Sockets vor dem Binden auf "True" setzen. Das sollte dein Problem lösen (es ist sogar mehr oder weniger verpflichtend für * nix) - Stephane


Ich habe das gleiche Problem früher konfrontiert, netstat -a -n Windows-Befehl gab mir die Liste der offenen Ports mit Prozess-ID. Von diesem habe ich die Portnummer abgeholt, die ich die Verbindung schließen wollte und dann schloss ich diese Verbindung, die TCPView Software benutzt. Das hat für mich funktioniert.


1
2018-06-26 05:33





Öffnen Sie die Eingabeaufforderung als admin

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

*** Wiederholen Sie Schritt 2, bis kein Kindprozess mehr stattfindet

  1. C: \ WINDOWS \ system32> wmic-Prozess, wobei (ParentProcessId = 1091) Caption, ProcessId erhalten

    Beschriftung ProcessId

    cmd.exe 1328

2.a. C: \ WINDOWS \ system32> wmic Prozess wo (ParentProcessId = 1328) erhalten       Beschriftung, Prozess-ID

  Caption  ProcessId

  conhost.exe  1128

2.b. Wiederholen Sie dies, bis keine weiteren untergeordneten Prozesse gefunden werden

- Töte dann alle Kindprozesse

  1. C: \ WINDOWS \ System32> Taskkill / F / PID 1128 ERFOLG: Der Prozess mit PID 9500 wurde beendet.

1
2018-05-10 20:51





Wenn Sie Windows-Benutzer sind, folgen Sie den nachstehenden Schritten Schritt 1: Gehen Sie zu diesem Pfad: Systemsteuerung \ Alle Elemente der Systemsteuerung \ Verwaltung

Schritt 2: Klicken Sie auf Dienste

Schritt 3: Stoppen Sie unerwünschte Dienste am gewünschten Port.


-4
2017-09-30 06:19





ps -ef | grep Prozessname

Töte die zugehörigen Prozesse

töten -9 pid pid

Arbeitete in meinem Fall


-5
2018-02-21 10:47



Diese Frage betrifft Windows und nicht Linux - longneck