Un proceso zombie en Linux se refiere a aquellos procesos ya muertos pero que, de una forma u otra, todavía están presentes en la tabla de procesos del sistema. La laguna es que, por alguna razón, el padre no limpió este proceso de la tabla de procesos. Por lo general, esto sucede después de la finalización del proceso de ejecución.
La forma habitual de funcionamiento en Linux es que después de que un proceso completa su ejecución, notifica a su padre, que es responsable de eliminar el proceso de la tabla. Desafortunadamente, el padre no puede eliminar el proceso de la memoria en los casos en que el padre no puede leer el estado del niño. Es así como resulta que tenemos procesos muertos en la tabla de procesos. Estos son los que llamamos procesos zombis.
¿Qué causa los procesos Linux Zombie?
Cuando se crea el proceso secundario, un proceso principal mal escrito puede fallar al llamar a la función wait(). Como resultado, sus niños zombis permanecerán en la memoria hasta que se extingan.
Esto significa que nada está monitoreando el proceso infantil en busca de cambios de estado, y se ignorará la señal SIGCHLD. Tal vez otra aplicación esté interfiriendo con la ejecución del proceso principal, ya sea a través de una mala programación o con malas intenciones.
La limpieza adecuada del sistema no se producirá si el proceso principal no está atento a los cambios de estado en el proceso secundario.
Cuando finaliza el proceso infantil, la PCB y la entrada en la tabla de procesos no se eliminarán. El estado zombi nunca se elimina de la PCB como resultado de esto.
Los zombis tienen algo de memoria, pero no suele ser un problema. Debido a que los sistemas Linux tienen una cantidad finita de PID (aunque una gran cantidad), si se eliminan suficientes PID, no se puede iniciar ningún otro proceso. Es dudoso que esto suceda.
Sin embargo, los procesos zombies sugieren que algo salió mal con una aplicación y que un programa específico puede tener un error.
Los errores de software en los centros de datos no deben tolerarse y deben abordarse.
Debe estar atento busque y destruya los procesos zombis hasta que se solucione la falla.
El ID del proceso no se puede reutilizar hasta que se inicia, por lo que la entrada de la tabla de procesos es pequeña.
Debido a que la PCB es mucho más grande que la entrada de la tabla de procesos en un sistema operativo de 64 bits, es poco probable que esto cause algún problema .
La cantidad de memoria disponible para otros procesos podría verse afectada por una gran cantidad de zombis. Sin embargo, si tiene tantos zombis, tiene un problema grave con la aplicación principal o un error en el sistema operativo.
Entonces, ¿qué haces cuando un procedimiento se convierte en un zombi? Rastree y elimine los procesos zombis.
¿Cómo encontrar un proceso zombie?
La parada inicial para matar un proceso zombie en el sistema es primero identificarlo. Debido a que el proceso init limpia los zombis regularmente, todo lo que tienes que hacer para deshacerte de ellos es destruir el proceso que los creó.
El comando superior es una forma rápida de ver si hay zombis en tu área. Para lograr esto, ejecutaremos el siguiente comando.
top
El número de procesos zombis en este sistema se mostrará en la salida. En nuestro caso anterior, tenemos 0 zombis.
Usando el comando ps y conectándolo a egrep, podemos obtener una lista de ellos. La bandera de estado para los procesos zombis es "Z" y, a veces, también verá "desaparecido".
tuts@fosslinux:~$ ps aux | egrep "Z|defunct"
Analicemos las distintas secciones de este comando.
Z en la columna STAT de la salida identifica un proceso zombi.
[desaparecido] en la última columna (COMANDO) de la salida también identifica un proceso zombi.
Idealmente, no es posible matar un proceso Zombie porque está muerto. En su lugar, notificamos al padre que intente leer el estado del proceso del niño y finalmente lo elimine de la tabla del sistema. Para desencadenar este proceso, enviamos una señal SIGCHLD al padre del proceso. Identificar el ID del proceso padre o lo que se llama PID implica ejecutar el siguiente comando:
tuts@fosslinux:~$ ps -o ppid= <Child PID>
Después de obtener el PID de Zombie, use la señal de comando SIGCHLD para los procesos principales identificados previamente.
tuts@fosslinux:~$ kill -s SIGCHLD <Parent PID>
En algunos casos, esto no elimina el proceso Zombie. Esto nos llama a involucrarnos en el plan b o c. Lo anterior implica reiniciar el proceso principal o eliminar los procesos principales. Por otro lado, los últimos casos implican reiniciar el sistema, especialmente cuando el proceso Zombie podría causar una interrupción o un aumento masivo debido al proceso Zombie.
A continuación se muestra el comando para eliminar el proceso principal.
tuts@fosslinux:~$ kill -9 <Parent PID>
En caso de que se elimine un proceso principal, por extensión, también se eliminarán todos los procesos secundarios del padre dado. En caso de que uno de los procesos secundarios sea crítico en el momento dado, es posible que deba posponer la eliminación hasta que sea seguro. Por otro lado, una doble verificación rápida puede decirle cuánta memoria o potencia de procesamiento están consumiendo los procesos de Zombie. Esto ayuda a determinar si la mejor opción es eliminar el procesador principal para reiniciar el sistema en el siguiente ciclo del mantenimiento del sistema que ya está programado.
En Linux, ¿cómo funcionan los estados de los procesos?
Por supuesto, Linux debe realizar un seguimiento de todas las aplicaciones y demonios que se ejecutan en su computadora. Mantener la tabla de procesos es una de las formas en que logra esto.
Esta es una lista de estructuras de memoria del núcleo. Esta lista incluye una entrada para cada proceso que contiene alguna información al respecto. Cada una de las estructuras de la tabla de procesos contiene muy poca información.
Almacenan el ID del proceso, algunos otros datos y un puntero al bloque de control del proceso (PCB).
El PCB es donde Linux almacena toda la información que necesita buscar o configurar para cada proceso. A medida que se crea un proceso, se modifica, se le da tiempo de procesamiento y luego se destruye.
Hay más de 95 campos en el PCB de Linux. Está definido en la estructura de la tarea, que tiene más de 700 líneas. Los siguientes tipos de información se pueden encontrar en el PCB:
Los estados del proceso se ilustran a continuación
- Número de proceso:el identificador distintivo del sistema operativo.
- Contador de programa:cuando este proceso vuelve a tener acceso a la CPU, el sistema utilizará esta dirección para ubicar la siguiente instrucción del proceso que se ejecutará.
- Registros:este procedimiento utiliza una lista de registros de CPU llamados registros. En la lista se pueden incluir acumuladores, registros de índice y punteros de pila.
- Lista de archivos abiertos:los archivos asociados con este procedimiento se incluyen en la Lista de archivos abiertos.
- Información de programación de la CPU:se utiliza para calcular con qué frecuencia y durante cuánto tiempo este proceso recibe tiempo de procesamiento de la CPU.
La PCB debe registrar la prioridad del proceso, los punteros a las colas de programación y otros parámetros de programación. - Información de gestión de la memoria:información sobre la memoria que utiliza este proceso, como las direcciones de inicio y finalización de la memoria del proceso, así como punteros a páginas de memoria.
- Información sobre el estado de E/S:cualquier dispositivo que el proceso utilice como entradas o salidas.
Cualquiera de los siguientes puede ser el "Estado del proceso":
- R:un proceso en ejecución o capaz de ejecutarse. Se está ejecutando, lo que significa que está recibiendo y ejecutando ciclos de CPU.
Un procedimiento que está listo para ejecutarse está esperando una ranura de CPU. - S:El acto de dormir.
El proceso está esperando la finalización de una acción, como una operación de entrada o salida. O la disponibilidad de un recurso. - D:El procedimiento se encuentra en un estado de suspensión no interrumpible. Está utilizando una llamada al sistema de bloqueo, lo que significa que no continuará hasta que se completen las llamadas al sistema. A diferencia del estado de "Reposo", un proceso en este estado no responderá a las señales hasta que se complete la llamada al sistema y la ejecución haya regresado al proceso.
- T:Debido a que recibió la señal SIGSTOP, el proceso finalizó (se detuvo).
Solo responderá a las señales SIGKILL o SIGCONT, ya sea matando o instruyendo al proceso para que continúe. Esto sucede cuando cambia de tareas en primer plano (fg) a segundo plano (bg). - Z:significa Proceso Zombi. Cuando un proceso termina, no desaparece simplemente. En su lugar, libera cualquier memoria que esté usando actualmente y sale de la memoria, pero su entrada en la tabla de procesos y PCB permanecen. señal SIGCHLD.
Conclusión
A menos que formen parte de una gran horda, los zombis no son tan dañinos. Algunos no son gran cosa, y un reinicio rápido los eliminará. Sin embargo, hay un punto a considerar.
Las arquitecturas de Linux tienen un número máximo de procesos y, como resultado, un número máximo de números de ID de proceso. Cuando se alcanza el número máximo de procesos zombis de una computadora, no se pueden iniciar nuevos procesos.
Los procesos zombis no son procesos; son los restos de procesos muertos que su proceso principal no ha limpiado correctamente. Sin embargo, si observa que una aplicación o un proceso en particular generan zombis constantemente, debe investigar más a fondo.
Lo más probable es que sea solo un programa mal escrito; en ese caso, tal vez haya una versión actualizada que se limpie después de que su hijo se procese correctamente.