Halloween en Linux: cómo matar procesos zombie

estampa de Halloween

Llega el día de los difuntos y por eso queremos hacer desde LxA este pequeño tutorial para hablar de los procesos zombie y de cómo podemos matarlos. Lo primero decir qué es eso de proceso zombie, y es que como sabrás el kernel Linux tiene un subsistema para gestionar los procesos y trabaja con el scheduler para crear, variar la prioridad, enviar o sacar del flujo de procesamiento de la CPU y matar procesos. Pues bien, esta parte del kernel, como el resto de sistemas tipo Unix, distingue entre varios estados de procesos…

Así nos podemos encontrar que un proceso puede estar en estado sleeping (S), es decir, dormido. También procesos en estado running (R) que son aquellos que están en marcha o ejecución actualmente, procesos waiting (D) que están detenidos a la espera de ser atendidos, gestopt (T) o suspendidos, y también los zombie (Z) o difuntos. Un proceso zombie o difunto es aquel que ya ha sido terminado con éxito, pero que tiene secuestrados ciertos recursos del sistema puesto que Linux aún lo está guardando en la tabla de procesos. Ya sabes que cuando un proceso termina, no debería quedarse en este estado, sino que se completa y el kernel libera los recursos para que otros procesos puedan usarlos, básicamente libera la memoria RAM ocupada…

Pues bien, como no interesa tener este tipo de procesos zombie, aunque no sean tan frecuentes, podemos buscarlos y eliminarlos como indicamos aquí. Lo primero es encontrar si existen procesos zombie en nuestra distro y para eso nos podemos ayudar de herramientas como top o como ps. Por ejemplo, alguna de estas dos opciones:


ps -el | grep 'Z'

ps aux | grep defunct

Y una vez detectado, podemos matarlo directamente con:


kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]’ | awk ‘{print $2}’`

Aunque otra alternativa es encontrar a los procesos padre, puesto que para matar a un proceso zombie hay que matar a los procesos padre que lo sustentan como habréis podido deducir:


ps -eo pid,ppid | grep <PID>

kill -9 <PPID>

Tendrás que sustituir <PID> por el ID del proceso zombie que hayas encontrado y para matarlo con kill, usar el ID del proceso padre sustituyendo <PPID> en el ejemplo, evidentemente.


Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *