Últimamente está muy de moda todo el género de los no muertos o los comúnmente llamados, por su término anglosajón, “zombies” (zombis en castellano), tanto en la literatura como en el cine. Diría incluso que se han metido de lleno en la llamada cultura pop. Hoy os explicaré cómo localizarlos y matarlos… Estoy hablando de procesos zombis en sistemas UNIX y GNU/Linux, ¿qué os pensabais?

Procesos hijo y padre

Lo dicho, en nuestros sistemas informáticos favoritos, un proceso zombi o difunto (“defunct”), es todo 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. Simplificando, el proceso hijo ha muerto pero su “alma” aún no ha sido recogida, vamos, ¡un muerto viviente en toda regla! 😀

Para localizar dichos procesos utilizaremos el comando ‘ps’ filtrando por ‘Z’, sigla que indica que un proceso está en modo zombi.

ps –el | grep –i ‘Z’

Añadiendo los parámetros ‘el’ se obtendrá una salida con el estado del proceso. Veamos cuáles pueden ser los resultados:

S : sleeping
R : running
D : waiting
T : gestopt (suspended)
Z : zombie (defunct)

Otras maneras de detectar los procesos zombi de manera fácil es utilizando el comando ‘top‘.

Proceso zombi encontrado mediante el comando top

Una vez detectado el proceso lo podemos matar de diferentes maneras. Para esto -‘cada maestrillo tiene su librillo‘- vamos a utilizar una combinación de órdenes como, por ejemplo:

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

Lo debemos hacer de esta manera tan compleja. Hay que tener en cuenta que el proceso en sí ya está muerto (más o menos), por lo que simplemente haciendo un «kill -9 » no bastaría. Para limpiar un zombi su proceso padre debe esperarlo, por lo que matar al padre debería funcionar.

Repasemos: en el comando anterior hemos utilizado el comando ‘kill‘, filtrado utilizando el comando ‘ps‘, que ya hemos comentando antes, y con ‘awk» indicamos que se seleccione sólo la segunda columna. De esta manera matamos el proceso padre que nos interesa.

Crear procesos zombi

Para el artículo he tenido que crear un proceso zombi para realizar pruebas de los comandos y así también tomar alguna captura. Esto lo he conseguido mediante un programita, escrito en C, que he encontrado por Internet. Es totalmente inofensivo y al cabo de unos segundos desaparecerá el proceso zombi que genera.

Aquí está:

#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main ()
{
  pid_t child_pid;

  child_pid = fork ();
  if (child_pid > 0) {
    sleep (60);
  }
  else {
    exit (0);
  }
  return 0;
}

Una vez creado el fichero lo tenemos que compilar. En mi caso lo realizo con el comando ‘gcc‘, de la siguiente manera:

gcc -o zombie1 zombie.c

Si lo queremos ejecutar en segundo plano sólo debemos añadir el símbolo ‘&’ al final, así:

.\zombie1 &

En fin, espero que el artículo haya sido de vuestro interés.


Fuentes consultadas y derechos de las imágenes

Para escribir el artículo me he servido de diferentes fuentes:

Wikipedia: proceso zombie

Stackoverflow: How to kill zombie process

Unix.com -Unix for dummies- Questions and Answers: How do you create zombie process?

La imagen de portada, inspirada en el juego «Space Invaders«, la he extraído de Flickr.

0 0 votos
Article Rating
Subscribe
Notificarme de
guest

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

8 Comments
más antiguo
más nuevo más votado
Reacciones en línea
Ver todos los comentarios
Marcelo

Interesante, gracias por compartir.

JVare

Muy interesante. Conocía el modo gráfico de hacerlo y de esa forma había zombis que no se dejaban matar.
La próxima vez ya se otra alternativa para hacerlo.

UnUsuari

el codigo c es correcto ? . seguro?
# include ¿¿