Wie macht man einen Port frei, der durch einen toten Prozess offen gehalten wird?


63

Ein Kollege von mir ist kürzlich auf ein Problem gestoßen, bei dem ein angeblich abgestorbener Prozess immer noch an einen Netzwerkport gebunden war, sodass andere Prozesse nicht an diesen Port gebunden werden konnten. Konkret netstat -a -bwurde berichtet, dass ein Systemmit PID 4476 benannter Prozess den Port 60001 offen hatte, außer dass kein Prozess mit PID 4476 existierte, zumindest soweit ich das beurteilen konnte.

Der Prozess-Explorer und der Task-Manager listeten PID 4476 nicht auf (obwohl es einen anderen Prozess mit dem Namen SystemPID 4 gab, der über einen eigenen Satz von TCP-Verbindungen ohne 60001 verfügte). taskkill /PID 4476berichtete 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 derzeit gebunden ist? Was kann dazu führen, dass dies passiert? Wie kann es Prozesse geben, von denen keiner von Task Manager, Process Explorer oder Taskkill etwas weiß? Durch einen Neustart konnte das Problem behoben werden, ich möchte jedoch wissen, ob dies ohne Neustart behoben werden kann.


Wie lange haben Sie gewartet, bis der Port freigegeben wurde? In welchem ​​Zustand war die Verbindung (Port)? Etabliert, geschlossen, Time_Wait?
Joeqwerty

@joeqwerty: Wir haben mindestens 15-20 Minuten gewartet. Leider vergesse ich, in welchem ​​Zustand die Verbindung war = /.
Adam Rosenfield

20 Minuten klingt nach einem Problem. Führen Sie das nächste Mal netstat aus und überprüfen Sie den Verbindungsstatus, um einen Hinweis darauf zu erhalten, was gerade passiert. Wie Sie auf die Antwort von mfinni geantwortet haben, kann dies an einem Absturz Ihrer Software / Ihres Dienstes liegen.
Joeqwerty

Antworten:


58

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

Möglicherweise war auf Ihrem Prozess ein TCP-Port offen, als er abstürzte oder auf andere Weise beendet wurde, ohne ihn explizit zu schließen. Normalerweise räumt das Betriebssystem diese Art von Dingen auf, aber nur, wenn der Prozessdatensatz verschwindet. Während der Prozess anscheinend nicht mehr ausgeführt wird, gibt es mindestens eine Möglichkeit, dies aufzuzeichnen, um die erneute Verwendung der PID zu verhindern. Dies ist die Existenz eines untergeordneten Prozesses, der nicht vom übergeordneten Prozess getrennt ist.

Wenn Ihr Programm während der Ausführung Prozesse erzeugt hat, versuchen Sie, diese zu beenden. Dadurch sollte der Prozessdatensatz freigegeben und der TCP-Port bereinigt werden. Anscheinend macht Windows dies, wenn der Datensatz freigegeben wird, nicht, wenn der Prozess beendet wird, wie ich es erwartet hätte.


1
Vielen Dank, mein Herr. Ich kann nicht glauben, dass diese Antwort so niedrig ist, zumal die Google-Abfrage mit Antworten "Use TCPView / Use Netstat & Taskkill" gefüllt ist, die in diesem Fall nicht helfen. In meinem Fall hat es geholfen, ProcessExplorer auszuführen und nach verwaisten Prozessen zu suchen. Das Herunterfahren löste das Problem.
Gwiazdorrr

3
Danke für deinen Hinweis !! Das Töten von Waisenkindern löste das Problem wirklich.
Darkthread

Vielen Dank!! Genau das war mir passiert. Ich habe den verwaisten Prozess getötet und der Hafen wurde freigegeben. Ich bin mir nicht sicher, wie ich mit dem Prozess-Explorer nach verwaisten Prozessen suchen soll, aber ich kannte die Namen der Prozesse, die erzeugt wurden, so dass sie leicht zu finden waren.
Grezzo

1
Wir hatten das gleiche Problem - und bei der Verwendung von Process Explorer stellte sich heraus, dass Dr. Watson an der alten PID festhielt. Wir suchten nach dem Port, den der Dienst öffnen wollte, und sahen dann 3-4 Einträge für Dr. Watson und die verwendete PID. Seltsamerweise mussten wir nichts implizit TÖTEN. Scheint so, als hätte dieser Prozess ihn aufgeweckt und er ist verschwunden. Das nächste Mal, als wir versuchten, den Dienst neu zu starten, ging es gut.
Tresstylez

Ein ähnliches Problem kann beim Debuggen mit VS auftreten. Ich hänge VS an den Prozess an und nach einigen Zyklen tritt die beschriebene Situation auf, aber keine meiner Prozesse (einschließlich der untergeordneten) werden beendet. Aber es hilft, "vsjitdebugger" zu töten.
Dmitry Azaraev

6

Haben Sie versucht, TCPView zu verwenden und die Verbindung zu beenden? Ich weiß nicht, ob es den Zusammenhang in dem Szenario zeigt, das Sie beschreiben, weil mir das noch nie passiert ist. Aber es ist das Einzige, woran ich denken kann, wenn dies noch einmal passiert.

Was war der Prozess - war es kommerzielle Software oder etwas Eigenes? 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öchten Sie dieser Maschine einen guten Einstieg in AV geben, vielleicht etwas von einem bootfähigen Medium.


Nein, wir haben TCPView nicht ausprobiert. Ich werde das für die Zukunft im Hinterkopf behalten, falls es jemals wieder passiert. Die Software ist unsere hauseigene Software, die Port 60001 verwendet. Ich bin fast sicher, dass der Prozess, der den Port offen hält, eine frühere Instanz unserer Software war, die irgendwie nicht vollständig abgestorben ist. Dadurch konnte keine weitere Kopie der Software gestartet werden.
Adam Rosenfield

Ihre Anwendung kann die Option SO_REUSEADDR des Sockets vor dem Binden auf true setzen. Das sollte dein Problem lösen (es ist auf * nix sogar mehr oder weniger obligatorisch)
Stephane

3

Öffnen Sie die Eingabeaufforderung als Administrator

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

*** Wiederholen Sie Schritt 2, bis kein untergeordneter Prozess mehr vorhanden ist

  1. C: \ WINDOWS \ system32> wmic-Prozess, bei dem (ParentProcessId = 1091) Caption, ProcessId abgerufen wird

    Caption ProcessId

    cmd.exe 1328

2.a. C: \ WINDOWS \ system32> wmic-Prozess, bei dem (ParentProcessId = 1328) Caption, ProcessId abgerufen wird

  Caption  ProcessId

  conhost.exe  1128

2.b. Wiederholen Sie diesen Vorgang, bis keine weiteren untergeordneten Prozesse gefunden wurden

- Dann alle untergeordneten Prozesse beenden

  1. C: \ WINDOWS \ system32> taskkill / F / PID 1128 ERFOLG: Der Vorgang mit PID 9500 wurde abgebrochen.

Der Befehl wmic war die einzige Möglichkeit, den untergeordneten Prozess zu identifizieren, mit dem unsere Ports geöffnet bleiben. Danke vielmals.
K Erlandsson

Dies war auch die einzige Möglichkeit, mein Problem zu beheben. Der Hauptprozess war verschwunden und der untergeordnete Prozess war in einem angehaltenen Zustand, hielt jedoch den TCP-Port mit dem Status "Listening". Danke.
Gui

1

Ich hatte vorhin das gleiche Problem. Der Befehl netstat -a -n Windows gab mir die Liste der offenen Ports mit der Prozess-ID. Daraufhin habe ich die Portnummer ermittelt, über die ich die Verbindung trennen wollte, und diese Verbindung dann mithilfe der TCPView-Software geschlossen. Das hat bei mir funktioniert.


-4

Wenn Sie Windows-Benutzer sind, führen Sie die folgenden Schritte aus: Schritt 1: Gehen Sie zu diesem Pfad: Systemsteuerung \ Alle Systemsteuerungselemente \ Verwaltung

Schritt 2: Klicken Sie auf Dienste

Schritt 3: Stoppen Sie unerwünschte Dienste, die auf dem gewünschten Port ausgeführt werden.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.