¿Qué es un proceso Zombie?

Un proceso zombie es una instancia de un programa informático que conserva un registro de la tabla de procesos a pesar de haber terminado de ejecutarse. Los procesos difuntos como estos suelen estar asociados con Unix® y otros sistemas operativos similares debido a la forma en que manejan los procesos secundarios. Cuando un proceso hijo ha terminado de ejecutarse, el padre suele ser responsable de eliminarlo de la tabla de procesos. Por lo general, no es posible eliminar directamente un proceso zombie con el comando kill, aunque a menudo se puede hacer que el padre lo elimine si el operador usa la notificación de señal secundaria (SIGCHLD). De lo contrario, un proceso zombi puede eliminarse indirectamente matando al padre.

El proceso zombi es un término descriptivo metafórico que hace referencia a los muertos vivientes. Los procesos difuntos en Unix® y sistemas operativos similares pueden considerarse análogos a los zombis en el sentido de que mantienen una presencia en la tabla de procesos a pesar de que ya no realizan sus funciones previstas. Cuando un proceso ha terminado de ejecutarse, a veces se dice que ha muerto, mientras que el medio por el cual el sistema operativo recupera la asignación de la tabla de procesos se conoce como cosecha. Se supone técnicamente que el proceso padre de un zombi cosecha a sus hijos, aunque esto no siempre sucede.

Hay ciertos casos en los que la existencia de un proceso zombi puede ser intencionada o incluso deseada. Una vez que un proceso hijo ha dejado de ejecutarse, es posible que el padre deba ejecutar otra instancia del mismo programa más adelante. Si no se ha eliminado un zombi de la tabla de proceso, a un nuevo niño no se le asignará la misma identificación (ID) que al niño anterior. Ciertos programas pueden beneficiarse o incluso requerir este tipo de diferenciación.

Si un proceso principal no ha ejecutado el comando de espera para cosechar zombis de los que es responsable, es posible forzar el problema. Por lo general, esto se hace mediante el comando kill y enviando la señal SIGCHLD al proceso principal. Si todo funciona correctamente, un proceso padre que reciba esta señal debería cosechar sus hijos zombies para que sus ID y posiciones de la tabla de procesos puedan reutilizarse.

En determinadas circunstancias, un proceso principal puede ignorar la señal SIGCHLD. Si esto ocurre y el operador aún desea que se borre la tabla de procesos, es posible que se elimine el proceso padre. Todos los zombis que haya creado el proceso padre se asignarán como hijos al proceso de inicio. Dado que init inicia periódicamente el comando de espera en sus hijos, los zombis de los que es responsable eventualmente se eliminarán de la tabla de procesos.