Cómo matar el proceso zombie

184

Lancé mi programa en primer plano (un programa demonio), y luego lo maté con kill -9, pero me queda un zombie y no puedo matarlo kill -9. ¿Cómo matar un proceso zombie?

Si el zombie es un proceso muerto (ya muerto), ¿cómo lo elimino de la salida de 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
fuente
2
Que ps -o ppid 1163dice Es decir, ¿quién es el padre de 1163? Ese es el proceso que debe ser terminado.
William Pursell

Respuestas:

250

Un zombie ya está muerto, así que no puedes matarlo. Para limpiar un zombie, su padre debe esperarlo, por lo que matar al padre debería funcionar para eliminar al zombi. (Después de que el padre muere, el zombi será heredado por pid 1, que esperará y borrará su entrada en la tabla de proceso). Si su demonio está generando niños que se convierten en zombis, tiene un error. Tu demonio debería notar cuándo mueren sus hijos y waitsobre ellos para determinar su estado de salida.

Un ejemplo de cómo puede enviar una señal a cada proceso que es el padre de un zombie (tenga en cuenta que esto es extremadamente crudo y podría matar procesos que no tiene intención. No recomiendo usar este tipo de martillo):

# Don't do this.  Incredibly risky sledge hammer!
kill $(ps -A -ostat,ppid | awk '/[zZ]/ && !a[$2]++ {print $2}')
William Pursell
fuente
1
Si el zombie es un proceso muerto (ya muerto), ¿cómo lo elimino de la salida de ps aux?
MOHAMED
186
El zombie debe ser atendido por su padre. Encuentre a su padre y descubra por qué ese padre no está prestando atención a sus hijos, luego presente una queja a los servicios sociales. ;)
William Pursell
1
Suponiendo que tiene un proceso que produce muchos zombis, tiene sentido 'unificar' los identificadores:kill $(ps -A -ostat,ppid | awk '/[zZ]/{print $2}' | sort -u)
ankon
2
por lo general, puede encontrar al padre en la PPidfila si ustedcat /proc/<pid>/status
Daniel Andrei Mincă
2
Acabo de imaginar gente que no es de TI viniendo aquí y leyendo esto. Loco.
ZitRo
68

Puede limpiar un proceso zombie eliminando su proceso padre con el siguiente comando:

kill -HUP $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')
Krishna Murti
fuente
66
Este comando borra al zombie de la tabla de procesos, pero no 'mata' al zombie. El zombie ya está muerto.
William Pursell
8
El grepno es necesario. ps ... | awk '/[zZ]/{print $2}'
William Pursell
2
AFAICS, este comando no mata al zombie, pero envía SIGHUP a su proceso padre (presumiblemente matando al padre si no maneja SIGHUP y provoca que el zombie sea reparented al init, como se describe en la respuesta anterior). Así que tenga cuidado con este comando, podría matar algo que no esperaba ...
Matthijs Kooijman
1
Esto no funcionó para mí. hice "kill -HUP processID" y el proceso sigue ahí como un zombie
kommradHomer
1
@WilliamPursell cuando responda una pregunta, describa la consecuencia del uso de la línea de comando y lo que hace explícitamente porque elimina todos los programas que se ejecutan en la computadora.
Dalek
39

Lo intenté:

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}

esto funcionará :)

Mohammad Rafiee
fuente
En mi caso, el zombie estaba creando a través de un script de inicio y un programa que no se eliminó claramente, así que lo borré.
Mohammad Rafiee
1
Trabajó para mi. Esto funcionará en ciertos casos cuando el proceso difunto fue generado por otro proceso muerto.
Eric S. Bullington
2
Verifiqué el proceso principal antes de matarlo. Y acabo de matarlo usando -9 en lugar de -1: kill -9 {the parent id}
Ali
También tuve que usar -9 para matar el mío en lugar de -1
Michael Smith
28

Lo encontré en http://www.linuxquestions.org/questions/suse-novell-60/howto-kill-defunct-processes-574612/

2) Aquí un gran consejo de otro usuario (Thxs Bill Dandreta): a veces

kill -9 <pid>

No matará un proceso. correr

ps -xal

El cuarto campo es el proceso de los padres, mata a todos los padres de un zombie y el zombie muere.

Ejemplo

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, 18583Son zombis -

kill -9 18581 18582 18583

no tiene efecto.

kill -9 31706

elimina a los zombies

Sergio
fuente
3
bueno, eso acaba de matar initpara mí, y ahora no puedo hacer nada y me veo obligado a reiniciar ... el proceso zombie es Java, con 3.4GB de 4GB de RAM
Tcll
22

Lo intenté

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

Y funciona para mi.

Jeoffrey
fuente