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?
kill -9
?747
i29971
są procesami zombie. Inni mogą być zamknięci, ale jeszcze nie umarli.Odpowiedzi:
Jak wspomniał Heemayl, nie można zabić zombie. Jest już [nie] martwy ...
Jednak napotkany problem wygląda jak problem z
git clone
poleceniem. 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órymSIGTERM
aSIGINT
nie działa.Aby go zabić, w tym przypadku chcesz użyć
-9
opcji wiersza polecenia. Oznacza to wysłanieSIGKILL
sygnału. Możesz-KILL
też użyć .Aby uzyskać listę dostępnych sygnałów, użyj opcji wiersza polecenia lista.
To pokazuje liczby i nazwiska (a zobaczysz, że numer 9 mówi SIGKILL).
źródło
kill -KILL
był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 wszystkimNie 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ć
SIGCHLD
do 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):(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 zinit
głównych zadań dziedziczenia sierot i wykonywanie ichwait(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ć.źródło
SIGCHLD
, nie ma zombie zostanie stworzony. Więc jeśli to nie ignorujeSIGCHLD
, a zombie nie zostaną zebrane, proces jest albo błędny, albo nie obchodzi ich zombie. Biorąc pod uwagę, że chodzi o ten procesgit 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.SIG_DFL
) dlaSIGCHILD
jest również zignorowanie jej, ale w tym przypadku zombie z pewnością nie zostaną automatycznie zebrane.SIG_DFL
) dlaSIGCHILD
jest 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łanieSIGCHLD
do procesu, dla którego jegoSIGCHLD
moduł obsługi jest ustawionySIG_IGN
(jawnie lub domyślnie), spowoduje, że ten proces zbierze zombie.SIGCHLD
moż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.szukać procesów zombie:
aby zabić proces zombie, należy zabić identyfikatory rodziców, tj. PPID:
źródło
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 ()”.
źródło