Cómo matar procesos zombies en Linux

Contenidos

Una ventana de terminal en una computadora portátil con Linux.

Los programas que están mal escritos o que funcionan mal pueden dejar procesos zombis al acecho dentro de su computadora Linux. Descubra cómo se crean los zombis y cómo en resumen puede dejarlos descansar.

Cómo funcionan los estados de procedimiento en Linux

Linux, desde luego, 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 manteniendo la tabla de procesos. Esta es una lista de estructuras en la memoria del kernel. Cada procedimiento cuenta con una entrada en esta lista que contiene información sobre él.

No hay mucho en cada una de las estructuras de la tabla de procesos. Sostienen el identificacion de proceso, algunos otros ítems de datos y un puntero al bloque de control de procedimiento (PCB) para ese procedimiento.

Es la PCB que contiene los muchos detalles que Linux necesita buscar o configurar para cada procedimiento. La PCB además se actualiza a medida que se crea un procedimiento, se le da tiempo de procesamiento y en resumen se destruye.

La PCB de Linux contiene más de 95 campos. Esta definido como una estructura llamada task_struct.hy tiene más de 700 líneas. La PCB contiene los siguientes tipos de información:

  • Estado de procedimiento: Los estados se describen a continuación.
  • Número de procedimiento: Su identificador único dentro del sistema operativo.
  • Contador de programa: Cuando este procedimiento tenga acceso a la CPU, el sistema usará esta dirección para hallar la próxima instrucción del procedimiento que debe ejecutarse.
  • Registros: La lista de registros de CPU utilizados por este procedimiento. La lista puede contener acumuladores, registros de índice y apuntadores de pila.
  • Abrir lista de archivos: Archivos asociados con este procedimiento.
  • Información de programación de CPU: Se utiliza para establecer la frecuencia y la duración del tiempo de procesamiento de la CPU a este procedimiento. La prioridad del procedimiento, los indicadores de las colas de programación y otros parámetros de programación deben registrarse en la PCB.
  • Información de administración de memoria: Detalles sobre la memoria que utiliza este procedimiento, como las direcciones de inicio y finalización de la memoria del procedimiento 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 procedimiento.

El «Estado del procedimiento» puede ser cualquiera de los siguientes:

  • R: Un procedimiento en ejecución o ejecutable. Ejecutando significa que está recibiendo ciclos de CPU y ejecutándose. Un procedimiento ejecutable está listo para ejecutarse y esperando una ranura de CPU.
  • S: Un procedimiento de dormir. El procedimiento está esperando que se complete una acción, como una operación de entrada o salida, o que un recurso esté disponible.
  • D: El procedimiento está en un estado de suspensión ininterrumpida. Está usando 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 procedimiento en este estado no responderá a las señales hasta que se complete la llamada al sistema y la ejecución haya regresado al procedimiento.
  • T: El procedimiento ha terminado (detenido) debido a que recibió la SIGSTOP señal. Eso solo responderá al SIGKILL o SIGCONT señales, que matan el procedimiento o le indican que continúe, respectivamente. Esto es lo que pasa cuando cambias de primer plano (fg) para antecedentes (bg) Tareas.
  • Z: Un procedimiento Zombie. Cuando se completa un procedimiento, no desaparece simplemente. Libera cualquier memoria que esté usando y se elimina a sí mismo de la memoria, pero su entrada en la tabla de procesos y PCB permanece. Su estado se establece en EXIT_ZOMBIE, y su procedimiento padre es notificado (por el SIGCHLD señal) que el procedimiento hijo ha acabado.

En el estado Zombie, el procedimiento padre llama a uno de los wait() familias de funciones cuando se crea el procedimiento hijo. Después espera un cambio de estado en el procedimiento hijo. ¿El procedimiento del niño 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 es uno que significa que el procedimiento hijo ha dejado de ejecutarse, se lee su código de salida. Después, la PCB del niño se destruye y se elimina su entrada en la tabla de procedimiento. Idealmente, todo esto sucede en un abrir y cerrar de ojos, y los procesos en el estado zombi no existen por mucho tiempo.

RELACIONADO: Cómo ejecutar y controlar procesos en segundo plano en Linux

¿Qué causa los procesos zombies en Linux?

Un procedimiento padre mal escrito podría no llamar al wait() función cuando se crea el procedimiento hijo. Esto significa que nada está pendiente de los cambios de estado en el procedimiento hijo, y el SIGCHLD la señal será ignorada. O tal vez otra aplicación está afectando la ejecución del procedimiento principal, ya sea debido a una mala programación o una intención maliciosa.

A pesar de esto, si el procedimiento principal no está atento a los cambios de estado en el procedimiento secundario, no se producirá el mantenimiento adecuado del sistema. La PCB y la entrada en la tabla de procesos no se eliminarán cuando finalice el procedimiento hijo. Esto da como consecuencia que el estado zombi nunca se elimine de la PCB.

Los zombis usan un poco de memoria, pero de forma general no representan un obstáculo. La entrada en la tabla de procesos es pequeña, pero, hasta que se publique, el ID de procedimiento no se puede reutilizar. En un sistema operativo de 64 bits, es poco probable que esto cause problemas debido a que 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 que queda libre para otros procesos. A pesar de esto, si dispones de tantos zombis, tienes un obstáculo grave con la aplicación principal o un error del sistema operativo.

Cómo quitar procesos Zombie

No puedes matar un procedimiento zombi debido a que ya está muerto. No responderá a ninguna señal debido a que se ha eliminado de la memoria; no hay ningún lugar al que enviar un SIGKILL señal. Puede intentar enviar el SIGCHLD señal al procedimiento padre, pero si no funcionó cuando el procedimiento hijo terminó, es poco probable que funcione ahora tampoco.

La única solución confiable es quitar el procedimiento principal. Cuando se termina, sus procesos secundarios son heredados por el init procedimiento, que es el primer procedimiento que se ejecuta en un sistema Linux (su ID de procedimiento es 1).

los init El procedimiento realiza regularmente la limpieza necesaria de zombis, por lo que para matarlos, solo debes de matar el procedimiento que los creó. los top El comando es una forma conveniente de ver si dispones de zombis.

Escriba lo siguiente:

top

Este sistema tiene ocho procesos zombies. Nosotros puede enumerar estos usando el ps mando y canalizándolo en egrep. Una vez más, los procesos zombies disponen una bandera de estado de «Z» y, por lo general, además verá «extinto».

Escriba lo siguiente:

ps aux | egrep "Z|defunct"

Se enumeran los procesos zombies.

Esta es una forma más ordenada de descubrir los ID de procedimiento de los zombies que desplazarse hacia adelante y hacia atrás top. Además vemos que una aplicación llamada «badprg» generó estos zombies.

El ID de procedimiento del primer zombi es 7641, pero necesitamos hallar el ID de procedimiento de su procedimiento padre. Podemos hacerlo usando ps de nuevo. Usaremos la opción de salida (-o) decir ps para mostrar solo el ID de procedimiento del padre y posteriormente pasarlo con el ppid= bandera.

El procedimiento que queremos hallar se indicará a través de la -p (procedimiento) y posteriormente pasar el ID de procedimiento del zombi.

Por eso, escribimos el siguiente comando para buscar la información del procedimiento para el procedimiento 7641, pero solo informará el ID del procedimiento principal:

ps -o ppid= -p 7641

Se nos mencionó que el ID del procedimiento principal es 7636. Ahora podemos hacer una referencia cruzada usando ps una vez más.

Vemos que esto coincide con el nombre del procedimiento principal anterior. Para matar el procedimiento principal, use la opción SIGKILL con el comando kill de la próxima manera:

kill -SIGKILL 7636

Dependiendo del propietario del procedimiento principal, es factible que además deba utilizar 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á.

A pesar de esto, si nota que una aplicación o un procedimiento siempre genera zombis, eso es algo que debe analizar. Lo más probable es que sea solo un programa escrito de manera descuidada, en cuyo caso, tal vez haya una versión actualizada que se limpie adecuadamente después de sus procesos secundarios.

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.