Cómo matar procesos zombies en Linux


Los programas mal escritos o de bajo rendimiento pueden dejar procesos zombis al acecho en su computadora Linux. Descubra cómo se crean los zombis y cómo finalmente puede acabar con ellos.
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 mantener 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 información al respecto.
No hay mucho en cada una de las estructuras de la tabla de procesos. Tienen el Identificacion de proceso, algunos otros elementos de datos y un puntero al bloque de control de proceso (PCB) para ese proceso.
Es la PCB que contiene los muchos detalles que Linux debe buscar o configurar para cada proceso. La PCB también se actualiza cuando se crea un proceso, dado el tiempo de procesamiento, y finalmente se destruye.
La PCB de Linux contiene más de 95 campos. Esta definido como una estructura llamada task_struct.h
, y tiene más de 700 líneas. La 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: Cuando a este proceso se le conceda el próximo acceso a la CPU, el sistema utilizará esta dirección para encontrar la siguiente instrucción del proceso a ejecutar.
- Registros: La lista de registros de CPU utilizados por este proceso. La lista puede contener acumuladores, registros de índice y apuntadores de pila.
- Abrir lista de archivos: Archivos asociados con este proceso.
- Información de programación de CPU: Se utiliza para determinar la frecuencia y duración del tiempo de procesamiento de la CPU asignado a este proceso. La prioridad del proceso, los indicadores de las colas de planificación y otros parámetros de planificación deben registrarse en la PCB.
- Información sobre la gestión de la memoria: Detalles sobre la memoria utilizada por este proceso, como las direcciones de inicio y finalización de la memoria del proceso y 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 uno de los siguientes:
- R: Un proceso en ejecución o ejecutable. En ejecución significa que está recibiendo ciclos de CPU y está funcionando. Un proceso ejecutable está listo para ejecutarse y esperando una ranura de CPU.
- S: Un proceso de sueño. El proceso está esperando que se complete una acción, como una operación de entrada o salida, o que un recurso esté disponible.
- RE: El proceso se encuentra en un estado de suspensión ininterrumpido. Utiliza una llamada al sistema de bloqueo y no puede continuar hasta que se completen 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 finalizó (abortó) porque recibió la extensión
SIGSTOP
señal. Eso solo responderé alSIGKILL
oSIGCONT
señales, que interrumpen el proceso o le indican que continúe, respectivamente. Esto es lo que sucede cuando cambia de primer piso (fg
) para antecedentes (bg)
deberes. - CON: Una prueba de zombies. Cuando se completa un proceso, no desaparece. Libera toda la 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 proceso padre recibe una notificación (deSIGCHLD
señal) que el proceso hijo ha finalizado.
En el estado Zombie, el proceso padre llama a uno de los archivos wait()
familias de funciones cuando se crea el proceso hijo. Luego espera un cambio de estado en el proceso hijo. ¿El proceso hijo fue interrumpido, continuado o abortado por una señal? ¿Terminó de completar de forma natural su código?
Si el cambio de estado indica que el proceso hijo ha dejado de funcionar, se lee su código de salida. Luego, la 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 el estado zombi no existen durante mucho tiempo.
RELACIONADO: Cómo ejecutar y controlar procesos en segundo plano en Linux
¿Qué causa los procesos zombies en Linux?
Es posible que un proceso principal mal escrito no llame al archivo wait()
cuando se crea el proceso hijo. Esto significa que nada está observando los cambios de estado en el proceso hijo y el archivo. SIGCHLD
la señal será ignorada. O tal vez otra aplicación esté afectando la ejecución del proceso principal, debido a una mala programación o intenciones maliciosas.
Sin embargo, si el proceso padre no observa cambios de estado en el proceso hijo, 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 proceso hijo. Esto asegura que el estado zombi nunca se elimine de la PCB.
Los zombis usan algo de memoria, pero generalmente no son un problema. La entrada en la tabla de procesos es pequeña, pero, hasta que se libera, el ID de proceso no se puede reutilizar. En un sistema operativo de 64 bits, es poco probable que esto 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, presumiblemente, 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 zombie
No puedes matar un proceso zombi porque ya está muerto. No responderá a ninguna señal porque se ha eliminado de la memoria; no hay ningún lugar para enviar un archivo. SIGKILL
señal. Puedes intentar enviar el archivo SIGCHLD
señal al proceso padre, pero si no funcionó cuando el proceso hijo salió, es poco probable que funcione incluso ahora.
La única solución confiable es eliminar el proceso principal. Cuando se termina, sus procesos secundarios se heredan de init
proceso, que es el primer proceso que se ejecuta en un sistema Linux (su ID de proceso es 1).
los init
El proceso realiza regularmente la limpieza necesaria de zombis, por lo que para matarlos, solo necesita matar el proceso que los creó. los top
El comando es una forma conveniente de ver si tienes zombis.
Escriba lo siguiente:
top
Este sistema tiene ocho procesos zombies. Nosotros puede enumerarlos utilizando la ps
mando y transmitirlo egrep
. Una vez más, las pruebas de zombis tienen una bandera de estado "Z" y, por lo general, también verá "fallecidos".
Escriba lo siguiente:
ps aux | egrep "Z|defunct"
Se enumeran los procesos zombies.
Esta es una forma más ordenada de averiguar los ID de procesos zombies en lugar de desplazarse hacia adelante y hacia atrás top
. También vemos que una aplicación llamada "badprg" generó estos zombies.
El ID de proceso del primer zombi es 7641, pero necesitamos encontrar el ID de proceso de su proceso padre. Podemos hacer esto usando
todavía. Usaremos la opción de salida (ps
-o
) decir ps
para mostrar solo el ID del proceso principal, luego páselo con ppid=
bandera.
El proceso que queremos encontrar se indicará mediante el -p
(proceso), luego pase el ID del proceso zombie.
Por lo tanto, escribimos el siguiente comando para buscar la información del proceso para el proceso 7641, pero solo informará el 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 usando ps
Una vez más.
Vemos que esto coincide con el nombre del proceso principal anterior. Para matar el proceso principal, use la opción SIGKILL con el comando kill de la siguiente manera:
kill -SIGKILL 7636
Según el propietario del proceso principal, es posible que también deba utilizar sudo
.
- Cómo funcionan los estados de proceso en Linux
- ¿Qué causa los procesos zombies en Linux?
- Cómo eliminar procesos zombie
Los zombis no dan miedo ...
... a menos que estén en una gran horda. Algunos no son nada de qué preocuparse y un simple reinicio los borrará.
Sin embargo, si nota una aplicación o un proceso que siempre genera zombis, eso es algo que debe investigar. 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 correctamente después de los procesos secundarios.
Deja una respuesta