¿Qué es un «proceso zombi» en Linux?

Si es un usuario de Linux, es posible que haya visto procesos zombis dando vueltas en su lista de procesos. No puedes matar un proceso zombi porque ya está muerto, como un zombi real.

Los zombis son básicamente los restos de procesos muertos que no se han limpiado correctamente. Un programa que crea procesos zombies no está programado correctamente: no se supone que los programas permitan que los procesos zombies se queden.

¿Qué es un proceso Zombie?

Para comprender qué es un proceso zombie y qué hace que aparezcan los procesos zombie, deberá comprender un poco cómo funcionan los procesos en Linux.

Cuando un proceso muere en Linux, no se elimina todo de la memoria inmediatamente; su descriptor de proceso permanece en la memoria (el descriptor de proceso solo ocupa una pequeña cantidad de memoria). El estado del proceso pasa a ser EXIT_ZOMBIE y se notifica al padre del proceso que su proceso hijo ha muerto con la señal SIGCHLD. Se supone que el proceso padre debe ejecutar la llamada al sistema wait () para leer el estado de salida del proceso muerto y otra información. Esto permite que el proceso padre obtenga información del proceso muerto. Después de llamar a wait (), el proceso zombie se elimina por completo de la memoria.

Esto normalmente sucede muy rápido, por lo que no verá que los procesos zombies se acumulen en su sistema. Sin embargo, si un proceso padre no está programado correctamente y nunca llama a wait (), sus hijos zombies se quedarán en la memoria hasta que se limpien.

Relacionado:  Cómo usar el comando vmstat en Linux

Utilidades como el Monitor del sistema GNOME, el comando superior y el comando ps muestran procesos zombie.

imagen

Peligros de los procesos zombis

Los procesos zombie no consumen ningún recurso del sistema. (En realidad, cada uno usa una cantidad muy pequeña de memoria del sistema para almacenar su descriptor de proceso). Sin embargo, cada proceso zombi conserva su ID de proceso (PID). Los sistemas Linux tienen un número finito de ID de proceso: 32767 de forma predeterminada en sistemas de 32 bits. Si los zombis se acumulan a un ritmo muy rápido, por ejemplo, si el software de servidor programado incorrectamente está creando procesos zombies bajo carga, todo el grupo de PID disponibles eventualmente se asignará a procesos zombies, evitando que se inicien otros procesos.

Sin embargo, algunos procesos zombies que están por ahí no son un problema, aunque sí indican un error con su proceso principal en su sistema.

imagen

Deshacerse de los procesos zombies

No puede matar procesos zombies como puede matar procesos normales con la señal SIGKILL; los procesos zombies ya están muertos. Tenga en cuenta que no necesita deshacerse de los procesos zombies a menos que tenga una gran cantidad en su sistema; algunos zombis son inofensivos. Sin embargo, hay algunas formas de deshacerse de los procesos zombies.

Una forma es enviando la señal SIGCHLD al proceso padre. Esta señal le dice al proceso padre que ejecute la llamada al sistema wait () y limpie sus hijos zombies. Envíe la señal con el comando kill , reemplazando pid en el comando a continuación con el PID del proceso padre:

kill -s SIGCHLD pid

Sin embargo, si el proceso principal no está programado correctamente e ignora las señales SIGCHLD, esto no ayudará. Tendrás que matar o cerrar el proceso principal de los zombies. Cuando finaliza el proceso que creó a los zombies, init hereda los procesos zombies y se convierte en su nuevo padre. (init es el primer proceso que se inicia en Linux en el arranque y se le asigna el PID 1). init ejecuta periódicamente la llamada al sistema wait () para limpiar a sus hijos zombis, por lo que init hará que los zombis trabajen rápidamente. Puede reiniciar el proceso principal después de cerrarlo.

Relacionado:  Cómo comprobar si su sistema Linux es de 32 bits o de 64 bits

Si un proceso padre continúa creando zombis, debe arreglarse para que llame correctamente a wait () para cosechar a sus hijos zombies. Presenta un informe de error si un programa de tu sistema sigue creando zombis.