Jak zabić proces zombie

187

Uruchomiłem swój program na pierwszym planie (program demona), a następnie zabiłem go kill -9, ale pozostało mi zombie i nie mogę go zabić kill -9. Jak zabić proces zombie?

Jeśli zombie jest martwym procesem (już zabitym), jak usunąć go z wyjścia ps aux?

root@OpenWrt:~# anyprogramd &
root@OpenWrt:~# ps aux | grep anyprogram
 1163 root      2552 S    anyprogramd
 1167 root      2552 S    anyprogramd
 1169 root      2552 S    anyprogramd
 1170 root      2552 S    anyprogramd
10101 root       944 S    grep anyprogram
root@OpenWrt:~# pidof anyprogramd
1170 1169 1167 1163
root@OpenWrt:~# kill -9 1170 1169 1167 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [anyprogramd]
root@OpenWrt:~# kill -9 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [anyprogramd]
MOHAMED
źródło
2
Co ps -o ppid 1163mówi? To znaczy, kto jest rodzicem 1163? To jest proces, który należy zakończyć.
William Pursell,

Odpowiedzi:

255

Zombie już nie żyje, więc nie możesz go zabić. Aby oczyścić zombie, musi czekać na niego jego rodzic, więc zabicie rodzica powinno działać na rzecz wyeliminowania zombie. (Po śmierci rodzica zombie zostanie odziedziczony przez pid 1, który zaczeka na niego i wyczyści swój wpis w tabeli procesów.) Jeśli twój demon tworzy dzieci, które stają się zombie, masz błąd. Twój demon powinien zauważyć, kiedy jego dzieci umierają i waitna nich określić ich status wyjścia.

Przykład tego, jak możesz wysłać sygnał do każdego procesu, który jest rodzicem zombie (pamiętaj, że jest to wyjątkowo prymitywne i może zabić procesy, których nie zamierzasz. Nie polecam używania tego rodzaju młota kowalskiego):

# Don't do this.  Incredibly risky sledge hammer!
kill $(ps -A -ostat,ppid | awk '/[zZ]/ && !a[$2]++ {print $2}')
William Pursell
źródło
1
Jeśli zombie jest martwym procesem (już zabitym), jak usunąć go z wyjścia ps aux?
MOHAMED
187
Na zombie musi czekać jego rodzic. Znajdź swojego rodzica i dowiedz się, dlaczego ten rodzic nie zwraca uwagi na swoje dzieci, a następnie złóż skargę do opieki społecznej. ;)
William Pursell,
1
Zakładając, że masz proces produkujący wiele zombie, sensowne jest „ujednolicenie” identyfikatorów:kill $(ps -A -ostat,ppid | awk '/[zZ]/{print $2}' | sort -u)
ankon
2
zazwyczaj możesz znaleźć rodzica w PPidrzędzie, jeślicat /proc/<pid>/status
Daniel Andrei Minca
3
Wyobrażałem sobie tylko ludzi spoza IT, którzy przychodzą tutaj i czytają to. Zwariowany.
ZitRo
69

Możesz wyczyścić proces zombie, zabijając jego proces nadrzędny za pomocą następującego polecenia:

kill -HUP $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')
krishna murti
źródło
6
To polecenie usuwa zombie z tabeli procesów, ale nie „zabija” zombie. Zombie już nie żyje.
William Pursell,
10
Nie grepjest to konieczne. ps ... | awk '/[zZ]/{print $2}'
William Pursell,
2
AFAICS, to polecenie nie zabija zombie, ale wysyła SIGHUP do jego procesu nadrzędnego (przypuszczalnie zabija rodzica, jeśli nie obsługuje SIGHUP i powoduje, że zombie zostanie ponownie zainicjowany, jak opisano w poprzedniej odpowiedzi). Więc bądź ostrożny z tym poleceniem, może zabić coś, czego się nie spodziewałeś ...
Matthijs Kooijman
1
To nie zadziałało dla mnie. Zrobiłem "kill -HUP processID" i proces nadal istnieje jako zombie
kommradHomer
1
@WilliamPursell Kiedy odpowiadasz na pytanie, opisz konsekwencje użycia wiersza poleceń i co robi on wyraźnie, ponieważ zabija wszystkie programy uruchomione na komputerze.
Dalek
39

Próbowałem:

ps aux | grep -w Z   # returns the zombies pid
ps o ppid {returned pid from previous command}   # returns the parent
kill -1 {the parent id from previous command}

to zadziała :)

Mohammad Rafiee
źródło
W moim przypadku zombie tworzył się za pomocą skryptu startowego i programu, który nie został wyraźnie usunięty, więc wyczyściłem go.
Mohammad Rafiee
1
Pracował dla mnie. To zadziała w niektórych przypadkach, gdy nieistniejący proces został wywołany przez inny proces zabicia.
Eric S. Bullington,
2
Sprawdziłem, co przetwarza rodzic, zanim go zabiłem. I właśnie zabiłem to, używając -9 zamiast -1: kill -9 {identyfikator rodzica}
Ali
Musiałem też użyć -9 do zabicia mojego zamiast -1
Michael Smith
28

Znalazłem go pod adresem http://www.linuxquestions.org/questions/suse-novell-60/howto-kill-defunct-processes-574612/

2) Oto świetna wskazówka od innego użytkownika (Thxs Bill Dandreta): Czasami

kill -9 <pid>

nie zabije procesu. Biegać

ps -xal

czwarte pole to proces rodzicielski, zabij wszystkich rodziców zombie, a zombie zginie!

Przykład

4 0 18581 31706 17 0 2664 1236 wait S ? 0:00 sh -c /usr/bin/gcc -fomit-frame-pointer -O -mfpmat
4 0 18582 18581 17 0 2064 828 wait S ? 0:00 /usr/i686-pc-linux-gnu/gcc-bin/3.3.6/gcc -fomit-fr
4 0 18583 18582 21 0 6684 3100 - R ? 0:00 /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.6/cc1 -quie

18581, 18582, 18583Są zombie -

kill -9 18581 18582 18583

nie ma żadnego efektu.

kill -9 31706

usuwa zombie.

Sergio
źródło
4
cóż, to właśnie zabiło initdla mnie, a teraz nie mogę nic zrobić i jestem zmuszony do ponownego uruchomienia ... proces zombie to Java, zabierający 3,4 GB z 4 GB pamięci RAM
Tcll
23

próbowałem

kill -9 $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')

i to działa dla mnie.

Jeoffrey
źródło
0

Czasami rodzic ppid nie może zostać zabity, stąd zabij pid zombie

kill -9 $(ps -A -ostat,pid | awk '/[zZ]/{ print $2 }')
Thiago Conrado
źródło