2013-06-05 16 views
124

Ich startete mein Programm im Vordergrund (ein Daemon-Programm), und dann tötete ich es mit kill -9, aber ich bekomme einen Zombie übrig und ich bin nicht in der Lage, es mit kill -9 zu töten. Wie töte ich einen Zombie-Prozess?Wie Zombie-Prozess zu töten

Wenn der Zombie ist ein toter Prozess (bereits getötet), wie ich es aus der Ausgabe von ps aux entfernen?

[email protected]:~# anyprogramd & 
[email protected]:~# 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 
[email protected]:~# pidof anyprogramd 
1170 1169 1167 1163 
[email protected]:~# kill -9 1170 1169 1167 1163 
[email protected]:~# ps aux |grep anyprogram 
1163 root   0 Z [cwmpd] 
[email protected]:~# kill -9 1163 
[email protected]:~# ps aux |grep anyprogram 
1163 root   0 Z [cwmpd] 
+2

Was sagt 'ps -o ppid 1163'? Das heißt, wer ist der Vater von 1163? Das ist der Prozess, der beendet werden muss. –

Antwort

169

Ein Zombie ist bereits tot, also können Sie ihn nicht töten. Um einen Zombie zu säubern, muss er von seinen Eltern darauf gewartet werden, also sollte das Töten des Elternteils funktionieren, um den Zombie zu eliminieren. (Nach dem Tod des Elternteils wird der Zombie von init geerbt, der darauf wartet und seinen Eintrag in der Prozesstabelle löscht.) Wenn dein Daemon Kinder hervorbringt, die zu Zombies werden, hast du einen Fehler. Ihr Daemon sollte bemerken, wenn seine Kinder sterben und wait auf ihnen ihren Exit-Status zu bestimmen.

Ein Beispiel, wie Sie ein Signal an jeden Prozess senden können, der das Elternteil eines Zombies ist (beachten Sie, dass dies extrem grob ist und Prozesse abtöten könnte, die Sie nicht beabsichtigen. Ich empfehle diese Art von Vorschlaghammer nicht):

kill $(ps -A -ostat,ppid | awk '/[zZ]/ && !a[$2]++ {print $2}') 
+1

Wenn der Zombie ist ein toter Prozess (bereits getötet), wie ich es aus der Ausgabe von "ps aux" entfernen? – MOHAMED

+113

Der Zombie muss von seinen Eltern gewartet werden. Finde seine Eltern und finde heraus, warum dieser Elternteil nicht auf seine Kinder aufpasst, und reiche dann eine Beschwerde bei den Sozialdiensten ein. ;) –

+26

_Wenn dein Dämon Kinder hervorbringt, die zombies_ werden, ziemlich satanisch! (Vorsätzliche Rechtschreibfehler sind absichtlich) – Shahbaz

25

ich habe versucht:

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} 

dies funktionieren wird :)

+4

Hat nicht für mich gearbeitet. –

+0

In meinem Fall erstellte der Zombie über ein Start-Skript und ein Programm, das nicht klar entfernt wurde, also habe ich es gelöscht. –

+1

Arbeitete für mich. Dies wird in bestimmten Fällen funktionieren, wenn der verstorbene Prozess durch einen anderen getöteten Prozess erzeugt wurde. –

59

Sie können mit t durch das töten von seinen Eltern-Prozess einen Zombie-Prozess aufzuräumen er folgenden Befehl ein:

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

Das funktionierte für mich. Es ist im Grunde das gleiche wie Mohammad Rafiees Lösung, aber in einer einfachen Zeile dargestellt. –

+3

Dieser Befehl löscht den Zombie aus der Prozesstabelle, aber er "tötet" den Zombie nicht. Der Zombie ist schon tot. –

+5

Das 'Grep' ist nicht notwendig. 'ps ... | awk '/ [zZ]/{print $ 2}' ' –

14

Ich versuchte

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

und es funktioniert für mich.

18

es

bei http://www.linuxquestions.org/questions/suse-novell-60/howto-kill-defunct-processes-574612/ gefunden

2) Hier ist ein guter Tipp von einem anderen Benutzer (Thxs Bill Dandreta):

kill -9 <pid> 

keinen Prozess Manchmal töten. Führen

ps -xal 

das 4rd Feld ist der übergeordnete Prozess, tötet alle von einem Zombie Eltern und der Zombie stirbt!

Beispiel

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, 18583 sind Zombies -

kill -9 18581 18582 18583 

keine Wirkung.

kill -9 31706 

entfernt die Zombies.

+1

gut, dass gerade 'init' für mich getötet, und jetzt kann ich nichts tun und bin gezwungen, neu zu starten ... der Zombie-Prozess ist Java, 3,4 GB von 4 GB RAM – Tcll