Solaris: terminar un proceso defunct (zombie) sin matar al padre

Hasta donde yo sé, en sistemas GNU/Linux cuando nos encontramos con procesos defunct/zombies, para poder terminar con ellos no queda otra opción que matar al proceso padre, y si desgraciadamente su padre es el PID 1 no queda más remedio que reiniciar el SO para librarnos de los defunct.

En el caso de Solaris la cosa cambia, a partir de Solaris 9 está disponible el comando preap, que permite forzar la muerte de un proceso para el cual su superior aún no ha obtenido su estado de salida.

$ preap 5725 
5725 : exited with status 0

Definición de proceso zombie de la Wikipedia:

En sistemas operativos Unix, un proceso zombi 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 zombi. El ID del proceso zombi y la entrada en la tabla de procesos pueden volver a usarse.

2 comentarios en “Solaris: terminar un proceso defunct (zombie) sin matar al padre

  1. En Linux, cuando init hereda un proceso zombie simplemente reclama su estado y lo mata (libera la entrada en al tabla de procesos. De man ps:

    These processes will be destroyed by init(8) if the parent process exits.

    Si es el propio init quien ha generado un zombie… se trataría de una aberración de init.

    Respecto a preap: ¿existe una herramienta similar para Linux/BSD?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *