Ú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‘.
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:
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.
Interesante, gracias por compartir.
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.
el codigo c es correcto ? . seguro?
# include ¿¿