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.
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?
¡Gracias por la info Emiliano! Creo que no hay nada similar para Linux ó BSD.
Saludos