Come uccidere il processo di zombi


184

Ho lanciato il mio programma in primo piano (un programma demone), e poi l'ho ucciso con kill -9, ma mi rimane uno zombi e non riesco a ucciderlo kill -9. Come uccidere un processo di zombi?

Se lo zombi è un processo morto (già ucciso), come lo rimuovo dall'output di 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]

2
Cosa ps -o ppid 1163dice? Cioè, chi è il genitore di 1163? Questo è il processo che deve essere terminato.
William Pursell,

Risposte:


250

Uno zombi è già morto, quindi non puoi ucciderlo. Per ripulire uno zombi, deve essere atteso dal suo genitore, quindi uccidere il genitore dovrebbe funzionare per eliminare lo zombi. (Dopo che il genitore muore, lo zombi sarà ereditato dal pid 1, che lo attenderà e cancellerà la sua voce nella tabella del processo.) Se il tuo demone sta generando bambini che diventano zombi, hai un bug. Il tuo demone dovrebbe notare quando i suoi figli muoiono e waitsu di loro per determinare il loro stato di uscita.

Un esempio di come potresti inviare un segnale ad ogni processo che è genitore di uno zombi (nota che questo è estremamente rozzo e potrebbe uccidere i processi che non intendi. Non consiglio di usare questo tipo di mazza):

# Don't do this.  Incredibly risky sledge hammer!
kill $(ps -A -ostat,ppid | awk '/[zZ]/ && !a[$2]++ {print $2}')

1
Se lo zombi è un processo morto (già ucciso), come lo rimuovo dall'output di ps aux?
MOHAMED,

186
Lo zombi deve essere atteso dal suo genitore. Trova il genitore e scopri perché quel genitore non presta attenzione ai propri figli, quindi presenta un reclamo ai servizi sociali. ;)
William Pursell il

1
Supponendo che tu abbia un processo che produce molti zombi, ha senso "uniq" gli id:kill $(ps -A -ostat,ppid | awk '/[zZ]/{print $2}' | sort -u)
ankon,

2
di solito, puoi trovare il genitore nella PPidfila se tucat /proc/<pid>/status
Daniel Andrei Mincă

2
Ho solo immaginato persone non IT che venivano qui e leggevano questo. Pazzo.
ZitRo,

68

Puoi ripulire un processo di zombi uccidendo il processo genitore con il seguente comando:

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

6
Questo comando cancella lo zombi dalla tabella dei processi, ma non "uccide" lo zombi. Lo zombi è già morto.
William Pursell,

8
Non grepè necessario. ps ... | awk '/[zZ]/{print $2}'
William Pursell,

2
AFAICS, questo comando non uccide lo zombi, ma invia SIGHUP al suo processo genitore (presumibilmente uccidendo il genitore se non gestisce SIGHUP e facendo ripartire lo zombi in init, come descritto nella risposta precedente). Quindi fai attenzione con questo comando, potrebbe uccidere qualcosa che non ti aspettavi ...
Matthijs Kooijman

1
Questo non ha funzionato per me. ho fatto "kill -HUP processID" e il processo è ancora lì come uno zombi
kommradHomer,

1
@WilliamPursell quando rispondi a una domanda, descrivi le conseguenze dell'uso della riga di comando e cosa fa esplicitamente perché uccide tutti i programmi in esecuzione sul computer.
Dalek,

39

Provai:

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}

questo funzionerà :)


Nel mio caso lo zombi stava creando tramite uno script di avvio e un programma che non era stato chiaramente rimosso, quindi l'ho cancellato.
Mohammad Rafiee,

1
Ha funzionato per me. Ciò funzionerà in alcuni casi in cui il processo defunto è stato generato da un altro processo ucciso.
Eric S. Bullington,

2
Ho controllato quale sia il processo genitore prima di ucciderlo. E l'ho appena ucciso usando -9 invece di -1: kill -9 {l'id genitore}
Ali

Ho anche dovuto usare -9 per uccidere il mio invece di -1
Michael Smith il

28

L'ho trovato su http://www.linuxquestions.org/questions/suse-novell-60/howto-kill-defunct-processes-574612/

2) Ecco un ottimo consiglio di un altro utente (Thxs Bill Dandreta): A volte

kill -9 <pid>

non ucciderà un processo. Correre

ps -xal

il quarto campo è il processo genitore, uccidi tutti i genitori di uno zombi e lo zombi muore!

Esempio

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, 18583Sono zombie -

kill -9 18581 18582 18583

non ha alcun effetto.

kill -9 31706

rimuove gli zombi.


3
beh, questo initmi ha appena ucciso , e ora non posso fare nulla e sono costretto a riavviare ... il processo di zombi è Java, prendendo 3,4 GB da 4 GB di RAM
Tll

22

Provai

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

e funziona per me.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.