Como eliminar procesos zombie en Linux

Como eliminar procesos zombie en Linux

Como eliminar procesos zombie en Linux

Vamos a ver como eliminar procesos zombie en Linux. Pero antes de esto tenemos que explicar lo que son estos procesos.

¿Qué es un proceso zombie?

En ocasiones nos enfrentamos con procesos Zombies, Defunct o Huerfano. Los procesos en sistemas Unix/Linux tienen una jerarquia, cuando un proceso crea otros procesos, estos nuevos procesos son llamados procesos hijos y el creador de los procesos es el proceso padre. Normalmente, cuando todo funciona como se espera, si el proceso padre muere, los hijos también lo harán.

Cuando hablamos de procesos Zombies, Defunct o Huerfano hablamos de procesos hijos cuyos padres han muerto, de cara al sistema se supone que ellos también pero al encontrarse en la lista de procesos se marca como Defunct. Esto rara vez ocurre, y cuando pasa nos encontramos con problemas provocados por este procesos como procesos que no se ejecutan correctamente, lentitud, etc.

Detectando procesos zombies

Utilizando el comando ps podemos detectar procesos zombieshuerfanos. Para ello ejecutaremos el comando:

ps -Al

Por ejemplo:

ger@DESKTOP-Q1D33PH:~$ ps -Al
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 1 0 0 80 0 - 2235 ? ? 00:00:00 init
0 S 0 8 1 0 80 0 - 2235 - tty1 00:00:00 init
0 S 1000 9 8 0 80 0 - 4229 - tty1 00:00:01 bash
0 S 0 66 1 0 80 0 - 2235 - tty2 00:00:00 init
0 S 1000 67 66 0 80 0 - 4229 - tty2 00:00:01 bash
0 S 1000 401 9 0 80 0 - 4671 - tty1 00:00:00 ssh
0 R 1000 418 67 0 80 0 - 4274 - tty2 00:00:00 ps
ger@DESKTOP-Q1D33PH:~$

La columna pid indica su ID de proceso. La columna ppid nos indica el ID del proceso padre.

En la columna S (la cual indica el estado) podemos ver los siguientes valores:

  • D– proceso esperando a que finalice alguna operación de Entrada/Salida
  • R– proceso en corriendo
  • S– procesos suspendidos (Está esperando para ejecutarse)
  • Z– proceso zombi

Cuando un proceso padre muere y no muere el hijo, pueden suceder dos cosas:

  • Si lo adopta el proceso mayor, el proceso con ID 1, se convierte en un procesos huerfanos
  • Si no ocurre lo anterior, se quedará sin ID de proceso padre y se convertira en zombie o defunt

Causas de este comportamiento

Hay distintas causas que pueden provocar este comportamiento. Algunas de ellas son las siguientes:

  • Al matar el proceso padre, el hijo tiene un bloqueo por hardware, por ejemplo un almacenamiento que no responde bien.
  • Existe algún bug en el software que que provoca que el proceso no finalice a tiempo.

¿Cómo matamos un proceso zombie?

Bueno, existen varias formas, pero en ocasiones, si el bloqueo está generado por lecturas y escrituras ya que es un proceso olvidado en el sistema es posible que lo mas rapido sea reiniciar el sistema. Antes de llegar a ese punto, vamos a ver varias formas de acabar con los procesos defunct:

La primera forma que podemos encontrar es la mas típica para matar de forma forzosa un proceso, es decir, utilizar:

kill -9 ID_DE_PROCESO

Eliminando zombies de forma masiva

Si queremos eliminar de forma masiva procesos zombie, tenemos las siguientes opciones, en ellas cambia la forma de buscar los procesos sobre todo:

kill -9 `ps xawo state=,pid=|sed -n 's/Z //p'`

Otra opción es:

kill -9 `ps -xaw -o state -o ppid | grep Z | grep -v PID | awk '{print $2}'`

Una tercera opción es:

ps -Ao state,pid | awk '$1=="2" {print $2}' | xargs kill -s SIGKILL

Una cuarta opción es:

ps -xaw -o state,ppid | grep Z | grep -v PID | awk '{ print $2 }' | xargs kill -9

Por ultimo tenemos este ultimo comando, que varia en la ejecución de la forma de mandar señál de HUP a los procesos zombie:

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

Es posible que ninguno de los comandos anteriores finalice el proceso zombie, si es así, por desgracia, se deberá reiniciar el sistema.

Deja una respuesta