Uno zombi è già morto, quindi non puoi ucciderlo. Per ripulire uno zombi, deve essere servito dal suo genitore, quindi uccidere il genitore dovrebbe funzionare per eliminare lo zombi. (Dopo la morte del genitore, lo zombi verrà ereditato dal pid 1, che lo aspetterà e cancellerà la sua voce nella tabella dei processi.) Se il tuo demone sta generando bambini che diventano zombi, hai un bug. Il tuo demone dovrebbe notare quando i suoi figli muoiono e wait
su di loro per determinare il loro stato di uscita.
Un esempio di come potresti inviare un segnale a ogni processo che è il genitore di uno zombi (nota che questo è estremamente rozzo e potrebbe uccidere 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}')
Ho provato:
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}
funzionerà :)
Trovato su http://www.linuxquestions.org/questions/suse-novell-60/howto-kill-defunct-processes-574612/
2) Ecco un ottimo suggerimento da un altro utente (Thxs Bill Dandreta):A volte
kill -9 <pid>
non ucciderà un processo. Esegui
ps -xal
il 4° 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
, 18583
sono zombie -
kill -9 18581 18582 18583
non ha alcun effetto.
kill -9 31706
rimuove gli zombi.
Puoi ripulire un processo zombie uccidendo il suo processo padre con il seguente comando:
kill -HUP $(ps -A -ostat,ppid | awk '{/[zZ]/{ print $2 }')