Procesos Zombies en Linux

Un proceso Zombie en Linux, es un proceso que ha sido terminado o parado,  pero cuyo proceso “padre” no ha podido recoger su estado de salida, por tanto no se para y desaparece de la memoria, sino que consta como Zombie en el inspector de procesos.

 
 

¿Por qué aparecen procesos Zombies?

 
Cuando un proceso muere en Linux, no desaparece inmediatamente. Su PID (descriptor de proceso) permanece en memoria, y se notifica al proceso padre que su proceso hijo ha muerto.
 


El proceso principal ejecuta una llamada al sistema wait(), para leer el estado de salida del proceso muerto. Es entonces cuando el proceso principal obtiene información acerca del proceso inactivo, y entonces el proceso se elimina completamente de memoria.
 


Pero si un proceso padre no puede hacer esta llamada al sistema wait(), porque el proceso se suspende o interrumpe de forma incorrecta, o porque no está correctamente programado, sus procesos “hijos” quedarán en memoria como procesos Zombies, y lo que podríamos hacer es matar esos procesos.



 

TE RECOMENDAMOS  Comandos básicos para trabajar con procesos Linux

 

Ejercicio sobre procesos Zombies en Linux

 
Vamos a verlo con un simple ejercicio.
—> Con el comando ps o con el comando top comprobamos los procesos en ejecución.
 
Vemos que la shell actual es el proceso con PID 12912

y creamos otras subshells.
la subshell “hijo” será la 12923
—> Además creamos otras subshells más llamándolos con el comando:



bash

 

 
 

 
 

Ahora enviamos a la subshell hijo la señal STOP.

Podemos ver en la columna STATUS, con la señal T, que el subshell se detiene sin recabar el estado de salida de sus shells “hijos“. Por ello, el shell 12939 (que realmente es un shell “hijo” de la primera subshell) está en estado Zombie (Z);
 
(Z defunct (“zombie”) process, terminated but not reaped by its parent).

 

TE RECOMENDAMOS  Cómo buscar con el comando Find en Linux

 
Podemos encontrar estos estados ejecutando:

man ps

 
 
El proceso Zombie aparece como [bash]

 




 
Pero solo hemos detenido la subshell, podemos comprobarlo con el comando jobs (jobs muestra los procesos que se encuentran suspendidos, o los que están corriendo en segundo plano):
 
Si volvemos a iniciar este bash, recuperaremos el estado de salida del subshell, y este recopilará los estados de salida de sus shell “hijos”, desapareciendo así los procesos Zombies.