En sistemas operativos Unix, un proceso zombie o “defunct” (difunto) es un proceso que ha completado su ejecución pero aún tiene una entrada en la tabla de procesos, permitiendo al proceso que lo ha creado leer el estado de su salida. Metafóricamente, el proceso hijo ha muerto pero su “alma” aún no ha sido recogida.
Cuando un proceso acaba, toda su memoria y recursos asociados a él se desreferencian, para que puedan ser usados por otros procesos. De todas formas, la entrada del proceso en la tabla de procesos aún permanece. Al padre se le envía una señal SIGCHLD indicando que el proceso ha muerto; el manejador para esta señal será típicamente ejecutar la llamada al sistema wait, que lee el estado de salida y borra al zombie. El ID del proceso zombie y la entrada en la tabla de procesos pueden volver a usarse.
Un proceso zombie no es lo mismo que un proceso huérfano. Los procesos huérfanos no se convierten en procesos zombies, sino que son adoptados por init (ID del proceso = 1), que espera a su hijo.
El término zombie deriva de la definición común de zombie (una persona no-muerta).
Los zombies pueden ser identificados en la salida por pantalla del comando de Unix ps por la presencia de una Z
en la columna de estado. Los zombies pueden existir por un corto período, que típicamente significa un error en el programa padre (un bug). Igualmente, la presencia de muchos procesos zombie puede indicar problemas en el sistema, y puede acarrear una alta carga del sistema, lentitud y respuestas lentas.
Un proceso dejado de forma abierta por el sistema de forma que no se pueda accede a él, Existe una instruccion en la CLI para acabar con este proceso aunque es posible que en un tiempo predeterminado este desaparesca de manera automática
Los procesos defunct, también conocidos como procesos “zombie”, son las que por alguna razón perdieron la relación con el padre o el padre perdió la relación con el proceso hijo, por lo que el último paso de limpieza no ocurre cuando el proceso termina.
Cuando un proceso muere, se convierte en un proceso zombie. Normalmente, el padre realiza un wait() y limpia el PID. Pero el padre sólo puede manejar una señal a la vez, y a veces el padre recibe demasiadas señales de SIGCHLD a la vez. Es posible volver a enviar la señal en nombre del hijo a través de un kill -18 PPID
. Matando el padre o reiniciando el sistema también eliminará los zombies. La mejor solución es arreglar el código fallido del padre que no ha podido realizar adecuadamente la llamdada wait() al sistema.
Normalmente mantener el sistema operativo y la aplicación a la par con respecto a los parches deberían encargase del problema; sin embargo, ocasionalmente pueden producirse zombies. No es de vital importancia que se limpien, ya que están inactivos y generalmente inofensivos.
Soporte de información : También puede escribir un rápido shell script y cron que cada hora busque a través de los procesos y mate los defunct.
Para ver los procesos zombies de un aix, se puede ejecutar la siguinte línea.
while true; do ps -ef | grep defunct | grep -v grep | awk '{ print "ps -fT "$3}'|sh ; sleep 1; done
O crear un script zombie.sh
#!/usr/bin/bash FILE_SH=`basename $0` function watchdog() { while true ; do `ps -ef | grep defunct | grep -v grep | awk '{ print "export OWNER="$1 " export ZOMBIE_PID="$2" export ZOMBIE_PPID="$3 }'` # # #echo $OWNER $ZOMBIE_PID $ZOMBIE_PPID case $ZOMBIE_PPID in 1) echo "Proceso $ZOMBIE_PID. Propietario $OWNER. Padre INIT" ;; [1-9]*) ps -fT $ZOMBIE_PPID ;; esac sleep $1 done } case $1 in 1|2|3) watchdog $1 ;; *) echo " " echo "Use: $FILE_SH (1|2|3) segundos de espera" echo " " ;; esac