Cómo matar procesos Zombie en Linux
Publicado: 2022-01-29Los programas que están mal escritos o funcionan mal pueden dejar procesos zombis al acecho dentro de su computadora Linux. Descubra cómo se crean los zombis y cómo finalmente puede ponerlos a descansar.
Cómo funcionan los estados de proceso en Linux
Linux, por supuesto, tiene que realizar un seguimiento de todas las aplicaciones y demonios que se ejecutan en su computadora. Una de las formas en que lo hace es mediante el mantenimiento de la tabla de procesos. Esta es una lista de estructuras en la memoria del kernel. Cada proceso tiene una entrada en esta lista que contiene alguna información al respecto.
No hay mucho en cada una de las estructuras de la tabla de procesos. Contienen la identificación del proceso, algunos otros elementos de datos y un puntero al bloque de control de proceso (PCB) para ese proceso.
Es el PCB que contiene muchos detalles que Linux necesita buscar o configurar para cada proceso. El PCB también se actualiza a medida que se crea un proceso, se le da tiempo de procesamiento y finalmente se destruye.
El PCB de Linux contiene más de 95 campos. Se define como una estructura llamada task_struct.h
y tiene más de 700 líneas. El PCB contiene los siguientes tipos de información:
- Estado del proceso : los estados se describen a continuación.
- Número de proceso : Su identificador único dentro del sistema operativo.
- Contador de programa : la próxima vez que este proceso tenga acceso a la CPU, el sistema usará esta dirección para encontrar la siguiente instrucción del proceso que debe ejecutarse.
- Registros : la lista de registros de CPU utilizados por este proceso. La lista puede contener acumuladores, registros de índice y punteros de pila.
- Abrir lista de archivos: archivos asociados con este proceso.
- Información de programación de CPU : se utiliza para determinar con qué frecuencia y durante cuánto tiempo se otorga tiempo de procesamiento de CPU a este proceso. La prioridad del proceso, los punteros a las colas de programación y otros parámetros de programación deben registrarse en el PCB.
- Información de gestión de la memoria : detalles sobre la memoria que utiliza este proceso, como las direcciones de inicio y final de la memoria del proceso y los punteros a las páginas de la memoria.
- Información de estado de E/S : cualquier dispositivo de entrada o salida utilizado por el proceso.
El "Estado del proceso" puede ser cualquiera de los siguientes:
- R: Un proceso en ejecución o ejecutable. En ejecución, lo que significa que está recibiendo ciclos de CPU y ejecutándose. Un proceso ejecutable está listo para ejecutarse y esperando una ranura de CPU.
- S: Un proceso de dormir. El proceso está esperando que se complete una acción, como una operación de entrada o salida, o que un recurso esté disponible.
- D: El proceso está en un estado de suspensión ininterrumpida. Está utilizando una llamada al sistema de bloqueo y no puede continuar hasta que se hayan completado las llamadas al sistema. A diferencia del estado de "suspensión", 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: El proceso ha terminado (detenido) porque recibió la señal
SIGSTOP
. Solo responderá a las señalesSIGKILL
oSIGCONT
, que eliminan el proceso o le indican que continúe, respectivamente. Esto es lo que sucede cuando cambias de tareas en primer plano (fg
) a tareas en segundo plano (bg)
. - Z: Un proceso Zombie. Cuando un proceso se completa, no desaparece simplemente. Libera cualquier memoria que esté usando y se elimina de la memoria, pero su entrada en la tabla de procesos y la placa de circuito impreso permanecen. Su estado se establece en
EXIT_ZOMBIE
y se notifica a su proceso principal (mediante la señalSIGCHLD
) que el proceso secundario ha finalizado.
En el estado Zombie, el proceso padre llama a una de las familias de funciones wait()
cuando se crea el proceso hijo. Luego espera un cambio de estado en el proceso hijo. ¿El proceso secundario ha sido detenido, continuado o eliminado por una señal? ¿Ha terminado ejecutando la finalización natural de su código?
Si el cambio de estado significa que el proceso secundario ha dejado de ejecutarse, se lee su código de salida. Luego, el PCB del niño se destruye y se elimina su entrada en la tabla de proceso. Idealmente, todo esto sucede en un abrir y cerrar de ojos, y los procesos en estado zombi no existen por mucho tiempo.
RELACIONADO: Cómo ejecutar y controlar procesos en segundo plano en Linux
¿Qué causa los procesos Zombie en Linux?
Es posible que un proceso principal mal escrito no llame a la función wait()
cuando se crea el proceso secundario. Esto significa que nada está observando los cambios de estado en el proceso secundario y se ignorará la señal SIGCHLD
. O quizás otra aplicación está afectando la ejecución del proceso principal, ya sea debido a una programación deficiente o a una intención maliciosa.
Sin embargo, si el proceso principal no está atento a los cambios de estado en el proceso secundario, no se realizará la limpieza adecuada del sistema. El PCB y la entrada en la tabla de procesos no se eliminarán cuando finalice el proceso secundario. Esto da como resultado que el estado zombie nunca se elimine de la PCB.
Los zombis usan un poco de memoria, pero por lo general no representan un problema. La entrada en la tabla de procesos es pequeña, pero, hasta que no se publique, el ID del proceso no se puede reutilizar. En un sistema operativo de 64 bits, es poco probable que cause problemas porque la PCB es mucho más grande que la entrada de la tabla de procesos.
Una gran cantidad de zombis podría, posiblemente, afectar la cantidad de memoria libre para otros procesos. Sin embargo, si tiene tantos zombis, tiene un problema grave con la aplicación principal o un error del sistema operativo.
Cómo eliminar procesos zombis
No puedes matar un proceso zombie porque ya está muerto. No responderá a ninguna señal porque se eliminó de la memoria; no hay ningún lugar para enviar una señal SIGKILL
. Puede intentar enviar la señal SIGCHLD
al proceso principal, pero si no funcionó cuando finalizó el proceso secundario, es poco probable que funcione ahora tampoco.
La única solución confiable es eliminar el proceso principal. Cuando finaliza, sus procesos secundarios son heredados por el proceso init
, que es el primer proceso que se ejecuta en un sistema Linux (su ID de proceso es 1).
El proceso de init
realiza regularmente la limpieza necesaria de zombis, por lo que para eliminarlos, solo tiene que eliminar el proceso que los creó. El comando top
es una forma conveniente de ver si tienes zombis.
Escribe lo siguiente:
cima
Este sistema tiene ocho procesos zombies. Podemos enumerarlos usando el comando ps
y conectándolo a egrep
. Nuevamente, los procesos zombis tienen una bandera de estado de "Z" y, por lo general, también verá "desaparecido".
Escribe lo siguiente:
ps auxiliar | egrep "Z|difunto"
Se enumeran los procesos zombie.
Esta es una forma más clara de descubrir los ID de proceso de los zombis que desplazarse hacia adelante y hacia atrás en la top
. También vemos que una aplicación llamada "badprg" generó estos zombis.
El ID de proceso del primer zombi es 7641, pero necesitamos encontrar el ID de proceso de su proceso principal. Podemos hacerlo usando
nuevamente. Usaremos la opción de salida ( ps
-o
) para decirle a ps
que muestre solo el ID del proceso principal y luego pasarlo con el ppid=
.
El proceso que queremos encontrar se indicará usando la opción -p
(proceso) y luego pasando la ID del proceso del zombi.
Por lo tanto, escribimos el siguiente comando para buscar la información del proceso para el proceso 7641, pero solo informará la ID del proceso principal:
ps -o ppid= -p 7641
Se nos dice que el ID del proceso principal es 7636. Ahora podemos hacer una referencia cruzada de esto usando ps
una vez más.
Vemos que esto coincide con el nombre del proceso principal anterior. Para eliminar el proceso principal, use la opción SIGKILL con el comando de eliminación de la siguiente manera:
matar -SIGKILL 7636
Según el propietario del proceso principal, es posible que también deba usar sudo
.
Los zombis no dan miedo...
… a menos que estén en una horda masiva. Algunos no son motivo de preocupación y un simple reinicio los eliminará.
Sin embargo, si nota que una aplicación o proceso siempre genera zombis, eso es algo que debe investigar. Lo más probable es que solo sea un programa mal escrito, en cuyo caso, tal vez haya una versión actualizada que se limpie correctamente después de los procesos secundarios.