Vraag Hoe maak je een haven vrij die door een proces wordt opengehouden?


Een collega van mij kwam onlangs een probleem tegen waar een vermoedelijk overleden proces nog steeds was verbonden met een netwerkpoort, waardoor andere processen zich niet aan die poort konden binden. In het bijzonder, netstat -a -b rapporteerde dat een proces met de naam System met PID 4476 had poort 60001 geopend, behalve dat er geen proces met PID 4476 bestond, tenminste voor zover ik kon zien.

Process Explorer en Task Manager hebben PID 4476 niet vermeld (hoewel er een ander proces met de naam was System met PID 4, die een eigen set TCP-verbindingen had zonder 60001). taskkill /PID 4476 meldde ook dat PID 4476 niet kon worden gevonden.

Is er een manier om dit mysterieuze systeemproces te doden om de poort vrij te maken waaraan het momenteel is gebonden? Wat kan dit veroorzaken? Hoe kunnen er processen zijn waarover Task Manager, Process Explorer en taskkill niets weten? Door te herstarten kon het probleem worden opgelost, maar ik zou graag willen weten of er een manier is om dit te herstellen zonder opnieuw op te starten.


49
2017-09-14 14:35


oorsprong


Hoe lang heb je gewacht om te zien of de poort is vrijgegeven? In welke staat zat de verbinding (poort)? Established, Closed, Time_Wait? - joeqwerty
@joeqwerty: We hebben minimaal 15-20 minuten gewacht. Helaas ben ik vergeten in welke staat de verbinding was = /. - Adam Rosenfield
20 minuten klinkt als een probleem. De volgende keer dat dit gebeurt, voert u netstat uit en controleert u de status van de verbinding. Dit geeft u een idee van wat er gebeurt. Zoals je echter tegen het antwoord van mfinni hebt gezegd, kan dit een gevolg zijn van het crashen van je software \ service. - joeqwerty


antwoorden:


Ik weet dat dit een oude draad is, maar voor het geval iemand anders hetzelfde probleem heeft, had ik ...

Wat er mogelijk aan de hand is, is dat uw proces een TCP-poort open had staan ​​toen deze crashte of op andere wijze werd afgesloten zonder deze expliciet te sluiten. Normaal gesproken ruimt het besturingssysteem dit soort dingen op, maar alleen als het procesrecord verdwijnt. Hoewel het proces misschien niet meer lijkt te draaien, is er tenminste één ding dat het kan bijhouden, om hergebruik van zijn PID te voorkomen. Dit is het bestaan ​​van een kindproces dat niet losstaat van de ouder.

Als je programma processen uitgelokt terwijl het actief was, probeer ze dan te doden. Dat zou ervoor moeten zorgen dat zijn procesrecord wordt bevrijd en dat de TCP-poort wordt opgeruimd. Blijkbaar doet Windows dit wanneer het record wordt vrijgegeven, niet wanneer het proces wordt afgesloten zoals ik had verwacht.


54
2018-05-25 18:18



Bedankt, goede heer. Ik kan niet geloven dat dit antwoord zo laag is, vooral omdat de google-vraag vol is met antwoorden "gebruik TCPView / gebruik netstat & taskkill" die in dit geval niet helpen. In mijn geval hielp ProcessExplorer met het zoeken naar processen die verweesd waren. Het afsluiten van het probleem loste het probleem op. - gwiazdorrr
Bedankt voor je hint !! Het verbreken van het weesproces heeft het probleem echt opgelost. - Darkthread
Bedankt!! Dit was precies wat er met mij was gebeurd. Ik heb het verweesde proces gedood en de poort is vrijgegeven. Ik weet niet zeker hoe ik naar verweesde processen met procesverkenner moet zoeken, maar ik kende de namen van de processen die werden uitgezet zodat het gemakkelijk te vinden was. - Grezzo
We hadden hetzelfde probleem - en met Process Explorer zag Dr. Watson de oude PID behouden. We zochten (Zoeken) naar de poort die de service probeerde te openen en zagen vervolgens 3-4 vermeldingen voor Dr. Watson en de PID die het gebruikte. Vreemd genoeg hoefden we niets impliciet te DOODEN. Het lijkt erop dat dat proces 'het wakker maakte' en het verdween. De volgende keer dat we probeerden de service opnieuw te starten, kwam het goed. - tresstylez
Een vergelijkbaar probleem kan optreden tijdens foutopsporing met VS. Ik bevestig VS om te verwerken en na een aantal cycli - beschreven situatie gebeurt, maar mijn processen (inclusief kinderen) gaan niet weg. Maar het doden van "vsjitdebugger" helpt. - Dmitry Azaraev


Heb je geprobeerd TCPView te gebruiken en de verbinding te sluiten? Ik weet niet of het de connectie zal laten zien in het scenario dat je beschrijft, want ik heb dat nooit met mij overkomen. Maar het is het enige dat ik kan bedenken als dit weer gebeurt.

Wat was het proces - was het commerciële software of iets inlands? Het lijkt erop dat poort 60001 door sommige Trojaanse paarden wordt gebruikt - ik vraag me af of het een rootkit zou kunnen zijn of iets dat zich zou kunnen verbergen voor het besturingssysteem? Zou die machine eens goed willen maken met AV, misschien iets van opstartbare media.


6
2017-09-14 14:47



Nee, we hebben TCPView niet geprobeerd; Ik zal dat voor de toekomst in gedachten houden als het ooit nog een keer gebeurt. De software is onze eigen software die poort 60001 gebruikt - ik ben er bijna zeker van dat het proces waarbij de poort open bleef, een vorige instantie van onze software was die op de een of andere manier niet helemaal volledig stierf. Dat belette een nieuw exemplaar van de software te lanceren. - Adam Rosenfield
Uw toepassing kan de optie SO_REUSEADDR van de socket instellen op true voordat deze wordt vastgemaakt. Dat zou je probleem moeten oplossen (het is zelfs meer of minder verplicht op * nix) - Stephane


Ik heb eerder met hetzelfde probleem te maken gehad, netstat -a -n windows command gaf me de lijst met open poorten met proces-ID. Daarvan heb ik het poortnummer opgepikt dat ik de verbinding wilde afsluiten en vervolgens sloot ik die verbinding af met behulp van TCPView-software. Dit werkte voor mij.


1
2018-06-26 05:33





Open de opdrachtprompt als beheerder

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

*** Herhaal stap 2 totdat er geen kinderproces meer is

  1. C: \ WINDOWS \ system32> wmic-proces waarbij (ParentProcessId = 1091) Caption, ProcessId

    Caption ProcessId

    cmd.exe 1328

2.a. C: \ WINDOWS \ system32> wmic-proces waarbij (ParentProcessId = 1328) wordt opgehaald       Bijschrift, processID

  Caption  ProcessId

  conhost.exe  1128

2.b. herhaal dit totdat geen verdere onderliggende processen zijn gevonden

- Dood vervolgens alle onderliggende processen

  1. C: \ WINDOWS \ system32> taskkill / F / PID 1128 SUCCES: het proces met PID 9500 is beëindigd.

1
2018-05-10 20:51





Als u Windows-gebruiker bent, voert u de onderstaande stappen uit Stap 1: Ga naar dit pad: Configuratiescherm \ Alle items in het Configuratiescherm \ Systeembeheer

Stap 2: Klik op services

Stap 3: stop ongewenste services op de gewenste poort.


-4
2017-09-30 06:19





ps -ef | grep processname

dood de gerelateerde processen

kill -9 pid pid

Werkte in mijn geval


-5
2018-02-21 10:47



deze vraag gaat over Windows, niet over Linux - longneck