proceso zombie no puede ser asesinado

¿Hay una manera de matar a un proceso zombie? He intentado llamar a exit para finalizar el proceso e incluso enviar una señal SIGINT al proceso, pero parece que nada puede detenerlo. Estoy progtwigndo para Linux.

Los procesos de zombis ya están muertos, por lo que no se pueden matar, solo se pueden eliminar, lo que debe hacerse mediante su proceso principal a través de wait*() . Esto generalmente se llama el lenguaje child reaper , en el controlador de señales para SIGCHLD :

 while (wait*(... WNOHANG ...)) { ... } 

Aquí hay un script que creé para matar TODOS los procesos zombis. Utiliza el depurador GDB para adjuntar al proceso principal y enviar un waitpid para matar el proceso zombie. Esto dejará al padre vivo y solo matará al zombi.

Deberá instalarse el depurador GDB y deberá iniciar sesión con permisos para adjuntar a un proceso. Esto ha sido probado en Centos 6.3.

 #!/bin/bash ################################################################## # Script: Zombie Slayer # Author: Mitch Milner # Date: 03/13/2013 ---> A good day to slay zombies # # Requirements: yum install gdb # permissions to attach to the parent process # # This script works by using a debugger to # attach to the parent process and then issuing # a waitpid to the dead zombie. This will not kill # the living parent process. ################################################################## clear # Wait for user input to proceed, give user a chance to cancel script echo "***********************************************************" echo -e "This script will terminate all zombie process." echo -e "Press [ENTER] to continue or [CTRL] + C to cancel:" echo "***********************************************************" read cmd_string echo -e "\n" # initialize variables intcount=0 lastparentid=0 # remove old gdb command file rm -f /tmp/zombie_slayer.txt # create the gdb command file echo "***********************************************************" echo "Creating command file..." echo "***********************************************************" ps -e -o ppid,pid,stat,command | grep Z | sort | while read LINE; do intcount=$((intcount+1)) parentid=`echo $LINE | awk '{print $1}'` zombieid=`echo $LINE | awk '{print $2}'` verifyzombie=`echo $LINE | awk '{print $3}'` # make sure this is a zombie file and we are not getting a Z from # the command field of the ps -e -o ppid,pid,stat,command if [ "$verifyzombie" == "Z" ] then if [ "$parentid" != "$lastparentid" ] then if [ "$lastparentid" != "0" ] then echo "detach" >> /tmp/zombie_slayer.txt fi echo "attach $parentid" >> /tmp/zombie_slayer.txt fi echo "call waitpid ($zombieid,0,0)" >> /tmp/zombie_slayer.txt echo "Logging: Parent: $parentid Zombie: $zombieid" lastparentid=$parentid fi done if [ "$lastparentid" != "0" ] then echo "detach" >> /tmp/zombie_slayer.txt fi # Slay the zombies with gdb and the created command file echo -e "\n\n" echo "***********************************************************" echo "Slaying zombie processes..." echo "***********************************************************" gdb -batch -x /tmp/zombie_slayer.txt echo -e "\n\n" echo "***********************************************************" echo "Script complete." echo "***********************************************************" 

Disfrutar.

Un proceso zombie es un ID de proceso (y el estado de terminación asociado y la información de uso de recursos) que aún no ha sido esperado por su proceso principal. Las únicas formas de eliminarlo son hacer que su padre lo espere (a veces esto se puede lograr enviando SIGCHLD al padre de forma manual si el padre solo tenía un cochecillo y tenía una condición de carrera en la que no tenía la oportunidad de esperar), pero generalmente usted está fuera de suerte a menos que usted termine por la fuerza al padre.

Edición: Otra forma, si estás desesperado y no quieres matar al padre, es adjuntarlo al padre con gdb y llamar forzosamente a waitpid sobre el niño zombie.

Si recuerdo correctamente, matar al padre de un proceso zombie permitirá que el proceso zombie muera.

use ps faux para obtener un buen árbol jerárquico de sus procesos en ejecución que muestren las relaciones padre / hijo.

kill -17 ZOMBIE_PID

O

kill -SIGCHLD ZOMBIE_PID

posiblemente funcionaría, pero, como todos los demás dijeron, está esperando que el padre llame a wait() por lo tanto, a menos que el padre muera sin cosechar, y se atasque allí por alguna razón, es posible que no quiera matarlo.

Ver unix-faqs “¿Cómo me deshago de los procesos zombie que perseveran?”

No puedes matar zombies, ya que ya están muertos. Pero si tienes demasiados zombies, entonces mata el proceso padre o reinicia el servicio.

Puedes intentar matar el proceso zombie usando su pid.

 kill -9 pid 

Ten en cuenta que kill -9 no garantiza matar un proceso zombie