2008-12-10 13 views
48

Mam nieistniejącego procesu w moim systemie:Zabicie nieistniejącego proces w systemie UNIX

abc  22093 19508 0 23:29 pts/4 00:00:00 grep ProcA 
abc  31756  1 0 Dec08 ?  00:00:00 [ProcA_my_collect] <defunct> 

Jak mogę zabić powyższy proces, bez restartu maszyny? Spróbowałem z

+0

Fakt, że identyfikator procesu nadrzędnego to 1, oznacza, że ​​cokolwiek zostało uruchomione, jest martwe. Nie jestem pewien, dlaczego "init" jeszcze go nie zebrał. –

+0

To zombie! Nie martw się, nie jest szkodliwy i niczego nie konsumuje. – Loki

+3

Właśnie zobaczyłem to na reddit: http://www.cs.cornell.edu/Courses/cs414/2007sp/tanenbaum.jpg – Loki

Odpowiedz

39

Zabiłeś proces , ale martwy proces nie znika z tabeli procesów, dopóki jego proces macierzysty nie wykona zadania zwanego "czerpaniem" (zasadniczo nazywając wait(3) dla tego procesu, aby odczytać jego status wyjścia). Martwe procesy, które nie zostały zebrane, są nazywane "zombie processes."

Identyfikator procesu nadrzędnego dla 31756 to identyfikator procesu 1, który zawsze należy do init. Proces ten powinien okresowo zbierać swoje procesy zombie, ale jeśli nie, pozostaną one zombie w tabeli procesów, dopóki nie uruchomisz ponownie komputera.

+3

Init na pewno zbiera martwe dzieci. Pomyśl o konsekwencjach, które nie są prawdziwe: każdy proces potomny musiałby zakończyć się przed rodzicem. – janm

+1

Restartowanie init może pomóc - w Linuksie, telinit u powinien być w stanie to zrobić. – bdonlan

+7

To ostatnie zdanie jest całkowicie błędne. Czerpanie dzieci jest właściwie jedyną rzeczą, którą robi init! –

0

Prawdopodobnie nie będziesz w stanie, jeśli zabicie rodzica go nie rozwiąże. Z jakiegoś powodu systemy nie zbierają tego procesu zombie.

FWIW, Widziałem to całkiem sporo na pudełku SCO Openserver, którego użyłem do administrowania. Intensywne korzystanie z wielu użytkowników i niskie zasoby systemowe, ale nic nie szkodzi. Zirytował mnie. :)

22

Czy sprawdziłeś proces potomny, który może wymagać zabicia w pierwszej kolejności? Czasami zacięcie się to na całej linii ... Spróbuj ps -ef --forest

aby zobaczyć, co może być pod nią (jeśli w ogóle), a następnie zabić, że po pierwsze, a następnie jeden wiesz już o

6

Jeśli zabicie -9 nie zabije procesu, przyczyną jest prawie zawsze błąd sterownika lub systemu operacyjnego.

Proces init przejął proces, ale nie może go wykonać. To znaczy: gdy wywołania init czekają (2), proces ten nie jest zwracany. Jednym z głównych celów init jest czerpanie martwych osieroconych dzieci, więc problem nie polega na tym, że jego rodzic zmarł zanim został zesłany. Pomyśl: Inaczej, kto zbiera wyniki procesu nohup'd po wylogowaniu?

Zabicie dzieci z nieistniejącego procesu najprawdopodobniej nie pomoże, chyba że są w jakiś sposób powiązane z konkretnym błędem, który widzisz.

+1

"Jeśli zabicie -9 nie zabije procesu, przyczyną jest prawie zawsze błąd sterownika lub systemu operacyjnego." To prawda, z wyjątkiem nieistniejącego procesu. kill -9 nie zrobi nic dla nieistniejącego procesu, tylko wysyła wysyła SIGKILL do jądra o procesie, ale jądro nie zarządza tabelą procesu na podstawie tego sygnału. – benc

+0

@benc: Zgadzam się, proces zombie jest już martwy i nie umrze więcej w odpowiedzi na SIGKILL. Jednak reszta mojej odpowiedzi brzmi: Wygląda na to, że błąd spowodował, że ten proces nie został pobrany przez init, gdy wywołuje wait(). – janm

0

Proces prawdopodobnie się zawiesza ignorując sygnały takie jak SIGPIPE, sprawdź z strace -p <pid>, co się tutaj dzieje.