Jak zwolnić port otwarty przez martwy proces?

63

Mój kolega ostatnio napotkał problem polegający na tym, że proces, który rzekomo umarł, był nadal związany z portem sieciowym, uniemożliwiając powiązanie innych procesów z tym portem. W szczególności netstat -a -braportował, że proces o nazwie SystemPID 4476 miał otwarty port 60001, z wyjątkiem tego, że nie istniał żaden proces z PID 4476, przynajmniej o ile mogłem to stwierdzić.

Process Explorer i Task Manager nie wymienili PID 4476 (chociaż istniał inny proces o nazwie SystemPID 4, który miał swój własny zestaw połączeń TCP, który nie obejmował 60001). taskkill /PID 4476poinformował także, że nie można znaleźć PID 4476.

Czy istnieje sposób na zabicie tego tajemniczego procesu systemowego, aby uwolnić port, z którym jest obecnie związany? Co może to spowodować? Jak mogą istnieć procesy, o których żaden Menedżer zadań, Eksplorator procesów i zadania nie wiedzą? Ponowne uruchomienie udało się rozwiązać problem, ale chciałbym wiedzieć, czy istnieje sposób, aby to naprawić bez ponownego uruchamiania.

Adam Rosenfield
źródło
Jak długo czekałeś, aby sprawdzić, czy port został zwolniony? W jakim stanie było połączenie (port)? Ustanowiony, zamknięty, czas oczekiwania?
joeqwerty
@joeqwerty: Czekaliśmy co najmniej 15-20 minut. Niestety nie pamiętam, w jakim stanie było połączenie = /.
Adam Rosenfield
20 minut brzmi jak problem. Następnym razem, gdy to nastąpi, uruchom netstat i sprawdź stan połączenia, co da ci wskazówkę, co się dzieje. Jednak, gdy skomentowałeś odpowiedź mfinni, może to być spowodowane awarią twojego oprogramowania / usługi.
joeqwerty

Odpowiedzi:

58

Wiem, że to stary wątek, ale na wypadek, gdyby ktoś miał ten sam problem, miałem ...

Może się zdarzyć, że proces miał otwarty port TCP, gdy ulegał awarii lub w inny sposób zakończył działanie bez wyraźnego zamknięcia. Zwykle system operacyjny czyści tego rodzaju rzeczy, ale tylko wtedy, gdy zapis procesu zniknie. Chociaż może się wydawać, że proces już nie działa, istnieje co najmniej jedna rzecz, która może go przechowywać, aby zapobiec ponownemu wykorzystaniu jego PID. Jest to proces potomny, który nie jest odłączony od rodzica.

Jeśli Twój program odrodził jakieś procesy podczas działania, spróbuj je zabić. Powinno to spowodować zwolnienie rekordu procesu i wyczyszczenie portu TCP. Najwyraźniej system Windows robi to po zwolnieniu rekordu, a nie po zakończeniu procesu, jak bym się spodziewał.

Ogapo
źródło
1
Dziękuję, proszę pana. Nie mogę uwierzyć, że ta odpowiedź jest tak niska, zwłaszcza, że ​​zapytanie Google jest wypełnione odpowiedziami „użyj TCPView / użyj netstat & taskkill”, które nie pomagają w tym przypadku. W moim przypadku pomogło uruchomienie ProcessExplorer i poszukiwanie każdego osieroconego procesu. Zamknięcie ich rozwiązało problem.
gwiazdorrr
3
Dzięki za podpowiedź !! Proces zabijania osieroconych naprawdę rozwiązał problem.
Darkthread
Dzięki!! Właśnie to mi się przydarzyło. Zabiłem osierocony proces i port został zwolniony. Nie jestem pewien, jak szukać osieroconych procesów za pomocą eksploratora procesów, ale znałem nazwy procesów, które zostały odrodzone, więc łatwo było je znaleźć.
Grezzo
1
Mieliśmy ten sam problem - a użycie Process Explorer wykazało, że dr Watson trzymał się starego PID. Szukaliśmy (Find) portu, który usiłowała otworzyć usługa, a następnie zobaczyliśmy 3-4 wpisy dla Dr. Watsona i PID, którego używał. O dziwo, nie musieliśmy niczego domyślnie ZABIJAĆ. Wydaje się, że ten proces „obudził go” i zniknął. Następnym razem, gdy próbowaliśmy ponownie uruchomić usługę, wyszło dobrze.
tresstylez
Podobny problem może wystąpić podczas debugowania za pomocą VS. Dołączam VS do procesu i po kilku cyklach - opisywana sytuacja się zdarza, ale żadne moje procesy (w tym dzieci) nie odchodzą. Ale zabicie „vsjitdebugger” pomaga.
Dmitry Azaraev,
6

Czy próbowałeś użyć TCPView i zamknąć połączenie? Nie wiem, czy pokaże to połączenie w opisywanym scenariuszu, ponieważ nigdy mi się to nie zdarzyło. Ale to jedyna rzecz, o której mogę pomyśleć, jeśli to się powtórzy.

Jaka była procedura - czy było to oprogramowanie komercyjne, czy coś domowego? Wygląda na to, że port 60001 jest używany przez niektóre trojany - zastanawiam się, czy mógł to być rootkit czy coś, co mogłoby ukryć się przed systemem operacyjnym? Może chciałbym dać tej maszynie dobry raz AV, może coś z nośnika startowego.

mfinni
źródło
Nie, nie próbowaliśmy TCPView; Będę o tym pamiętać na przyszłość, jeśli to się powtórzy. Oprogramowanie to jest naszym wewnętrznym oprogramowaniem korzystającym z portu 60001 - jestem prawie pewien, że proces utrzymywania otwartego portu był poprzednią instancją naszego oprogramowania, która jakoś nie do końca umarła. To uniemożliwiło uruchomienie kolejnej kopii oprogramowania.
Adam Rosenfield
Twoja aplikacja może ustawić opcję SO_REUSEADDR gniazda na true przed powiązaniem. To powinno rozwiązać twój problem (jest to mniej więcej obowiązkowe dla * nix)
Stephane
3

Otwórz wiersz polecenia jako administrator

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

*** Powtarzaj krok 2, aż nie będzie już procesu potomnego

  1. C: \ WINDOWS \ system32> proces wmic, w którym (ParentProcessId = 1091) pobiera podpis, ProcessId

    Caption ProcessId

    cmd.exe 1328

2.a. C: \ WINDOWS \ system32> proces wmic, w którym (ParentProcessId = 1328) pobiera podpis, ProcessId

  Caption  ProcessId

  conhost.exe  1128

2.b. powtarzaj to, dopóki nie zostaną znalezione dalsze procesy potomne

- Następnie zabij wszystkie procesy potomne

  1. C: \ WINDOWS \ system32> taskkill / F / PID 1128 SUCCESS: Proces z PID 9500 został zakończony.
Srinivas
źródło
Komenda wmic była jedynym sposobem, w jaki udało nam się zidentyfikować proces potomny, który faktycznie utrzymywał nasze porty otwarte. Wielkie dzięki.
K Erlandsson
To był jedyny sposób, w jaki udało mi się rozwiązać problem. Proces główny zniknął, a proces potomny był w stanie zawieszenia, ale nadal utrzymywał port TCP ze stanem „Słuchanie”. Dziękuję Ci.
Gui
1

Wcześniej miałem ten sam problem, polecenie netstat -a -n windows podało mi listę otwartych portów o identyfikatorze procesu. Następnie wybrałem numer portu, który chciałem zamknąć, a następnie zamknąłem to połączenie za pomocą oprogramowania TCPView. To zadziałało dla mnie.

Elavarasi
źródło
-4

Jeśli jesteś użytkownikiem systemu Windows, wykonaj poniższe kroki Krok 1: Przejdź do tej ścieżki: Panel sterowania \ Wszystkie elementy panelu sterowania \ Narzędzia administracyjne

Krok 2: Kliknij usługi

Krok 3: Zatrzymaj niechciane usługi działające na pożądanym porcie.

użytkownik314053
źródło
-5

ps -ef | nazwa procesu grep

zabij powiązane procesy

zabij -9 pid pid

W moim przypadku zadziałało

java maniakiem
źródło
6
to pytanie dotyczy systemu Windows, a nie Linuksa
longneck