Alternatywny sposób na zabicie procesu zombie


19

Właśnie zauważyłem niektóre procesy zombie na CentOS 6.8 (wersja ostateczna), próbowałem je zabić, ale wciąż tam są:

[root@host user]# ps -ef | grep git
tomcat     746     1  0 Jul18 ?        00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat     747   746  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>
root     20776 20669  0 09:03 pts/3    00:00:00 grep git
tomcat   29970     1  0 Jul18 ?        00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat   29971 29970  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>

[root@host user]# kill 746 747 29970 29971

[root@host user]# ps -ef | grep git
tomcat     746     1  0 Jul18 ?        00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat     747   746  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>
root     21525 20669  0 09:26 pts/3    00:00:00 grep git
tomcat   29970     1  0 Jul18 ?        00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat   29971 29970  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>

Jak widać, działają przez dwa miesiące, a także, jeśli nie są szkodliwe, pozbyłbym się ich, jakikolwiek alternatywny sposób na zabicie Zombie?


1
próbowałeś kill -9?
Ipor Sircer,

7
Tylko 747i 29971są procesami zombie. Inni mogą być zamknięci, ale jeszcze nie umarli.
roaima,

Wygląda na to, że masz błąd w kodzie uruchomionym na tomcat ...
Boris the Spider

Odpowiedzi:


8

Jak wspomniał Heemayl, nie można zabić zombie. Jest już [nie] martwy ...

Jednak napotkany problem wygląda jak problem z git clonepoleceniem. Jakoś utknął. Prawdopodobnie przekroczył limit czasu lub zawiódł w inny sposób? Często z powodu niektórych operacji we / wy proces blokuje się do punktu, w którym SIGTERMa SIGINTnie działa.

Aby go zabić, w tym przypadku chcesz użyć -9opcji wiersza polecenia. Oznacza to wysłanie SIGKILLsygnału. Możesz -KILLteż użyć .

[root@host user]# kill -KILL 746 29970

Aby uzyskać listę dostępnych sygnałów, użyj opcji wiersza polecenia lista.

[root@host user]# kill -l

To pokazuje liczby i nazwiska (a zobaczysz, że numer 9 mówi SIGKILL).


1
W rzeczywistości kill -KILLbyło to jedyne polecenie, które mogło zamknąć te procesy, dlatego przyjmuję odpowiedź @Alexis Wilke. Ale z pewnością chciałbym wyrazić moją wdzięczność dla @heemayl szybkiej, mądrej i bardzo pouczającej odpowiedzi +1. Dziękujemy wszystkim
proszę

39

Nie możesz zabić Zombie (proces), jest już martwy. Po prostu czeka na wykonanie procesu nadrzędnego wait(2)i zebranie statusu wyjścia. To nie zajmie żadnych zasobów w systemie innych niż pozycja tabeli procesów.

Możesz wysłać SIGCHLDdo jego rodzica, aby poinformować go, że jedno z jego dzieci zakończyło pracę (tj. Poprosić go o pobranie statusu wyjścia dziecka). Ten sygnał można zignorować (co jest ustawieniem domyślnym):

kill -CHLD <PPID>

(Zamień <PPID>na rzeczywisty PID rodzica.)

Możesz też zabić proces nadrzędny, aby init(PID 1) odziedziczył proces zombie i zebrał go prawidłowo (jest to jedno z initgłównych zadań dziedziczenia sierot i wykonywanie ich wait(2)regularnie). Ale zabicie rodzica nie jest zalecane. Ogólnie rzecz biorąc, tworzenie procesów zombie wskazuje na problem / problemy z programowaniem i powinieneś spróbować je naprawić lub zgłosić.


8
Możesz wysłać SIGCHLD do jego rodzica, aby poinformować go, że jeśli dziecko jest zakończone (tj. Zażąda, aby odebrał status wyjścia dziecka), ten sygnał można zignorować (domyślnie) Problem polega na tym, że jeśli proces ignoruje SIGCHLD, nie ma zombie zostanie stworzony. Więc jeśli to nie ignoruje SIGCHLD, a zombie nie zostaną zebrane, proces jest albo błędny, albo nie obchodzi ich zombie. Biorąc pod uwagę, że chodzi o ten proces git clone ..., założę się, że po prostu nie przejmuje się dziećmi zombie, ponieważ jest to (miejmy nadzieję) krótkotrwały proces, który wykonuje swoją pracę, a następnie kończy działanie.
Andrew Henle,

1
@AndrewHenle: Chociaż jest to w większości prawda, domyślną akcją ( SIG_DFL) dla SIGCHILDjest również zignorowanie jej, ale w tym przypadku zombie z pewnością nie zostaną automatycznie zebrane.
R ..

@R Chociaż jest to w większości prawdą, domyślną akcją ( SIG_DFL) dla SIGCHILDjest również zignorowanie jej, ale w tym przypadku zombie z pewnością nie zostaną automatycznie zebrane. Nie jestem pewien, o czym mówisz. Czy masz na myśli procesy, które nie zostały wykorzystane w pytaniu? Nie widzę, w jaki sposób wysyłanie SIGCHLDdo procesu, dla którego jego SIGCHLDmoduł obsługi jest ustawiony SIG_IGN(jawnie lub domyślnie), spowoduje, że ten proces zbierze zombie.
Andrew Henle,

1
@AndrewHenle, tym razem wysyłanie SIGCHLDmoże zadziałać . Ostatni raz, gdy mógł nie trafić na sygnał lub dwoje dzieci zmarło w tym samym czasie, a kod nie jest wystarczająco inteligentny, aby poradzić sobie z obydwoma zgonami jednocześnie.
Alexis Wilke,

To nie może zranić, ale nie postawiłbym na to, żeby działało.
Barmar

2

szukać procesów zombie:

ps aux | grep -w Z | grep -v grep

ps -eo stat,ppid | grep -w Z

aby zabić proces zombie, należy zabić identyfikatory rodziców, tj. PPID:

kill PPID1 PPID2

kill $(ps -eo stat,ppid|grep -w Z|awk '{print $2}'|tr "\n" " ")

0

Kiedy proces nadrzędny umiera, cały proces zombie zostanie oczyszczony. Nie zabijaj procesu nadrzędnego, aby oczyścić proces zombie. Pojawi się ponownie po ponownym uruchomieniu programu. Napraw swój program, wywołując poprawnie wywołanie systemowe „wait ()” lub „waitpid ()”.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.