Procesos zombies

Leyendo una entrada de elav recordé que en un foro alguien pidió ayuda ya que su sistema estaba lento, algunas de las soluciones se enfocaban en los procesos.

Los principales estados de los procesos en Linux son:
Sleeping (S) : Procesos que están esperando su turno para ejecutarse.
Running (R) : Procesos que están en ejecución.
Waiting (D) : Procesos esperando a que se finalice alguna operación de Entrada/Salida.
Zombie (Z) : Procesos que han terminado pero que siguen apareciendo en la tabla de procesos. Se pueden deber a errores de programación y pueden ser el síntoma de un sistema lento o que provoca problemas.

Un proceso Zombie es aquel que nunca recibió una señal por parte del proceso padre que lo creo, un proceso hijo es aquel que tiene su origen en un proceso de nivel superior conocido como proceso padre que es el encargado de enviar las señales a los procesos hijos generados por el mismo para indicarles que su lapso de vida ha terminado.

Se pueden deber a errores de programación y pueden ser el síntoma de un sistema lento o que provoca problemas. Esta situación suele ocurrir,también debido a que alguna configuración no fue contemplada por el desarrollador.

En la Wikipedia se puede leer más acerca de estos procesos.

Ejecutando el comando top podemos ver en tiempo real los procesos que se están ejecutando en el sistema, y nos indicara si hay alguno en estado zombie, pero no nos indica cual es.

proceso

Para verlos todos los procesos teclear en la terminal: ps aux, y para ver sólo los zombies: ps -el |grep ‘Z’o ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]‘

alf@Alf ~ $ ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]‘

Z 1945

Si al listar los procesos aparece alguno con estado Z, significa que es un zombie, lo cual a su vez quiere decir que la aplicación no está bien solventada o tiene bugs, sabiendo su PID  se puede eliminar  ejecutando en la terminal un comando similar a, en este ejemplo: 

alf@Alf ~ $ kill -9 1945

Cuando tienes muchos procesos zombie o al menos mas de uno, puedes usar el siguiente comando que arrasa con ellos, solo sirve para eso, si lo ejecutas sin tener procesos zombies no sucederá nada:

alf@Alf ~ $ sudo kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]‘ | awk ‘{print $2}’`

Saludos