Cómo identificar y matar procesos bloqueados (Zombies) en tu servidor Imprimir

  • 0

En los sistemas operativos basados en Linux, cuando un proceso hijo termina su ejecución, le avisa a su proceso padre para que este borre su registro de la memoria del sistema. Si el proceso padre ignora este aviso o queda congelado, el proceso hijo se convierte en un proceso zombie.

Un proceso zombie es, literalmente, un "proceso muerto" que ya no consume CPU ni memoria RAM, pero sigue ocupando un espacio en la tabla de procesos del sistema (PID). Si se acumulan demasiados, tu VPS puede quedarse sin identificadores disponibles y dejar de funcionar correctamente.

A continuación, te enseñamos cómo localizarlos y resolver este problema de forma segura.

1. ¿Cómo saber si hay procesos zombies en tu VPS?

La forma más rápida de obtener un diagnóstico general es utilizando el comando top o htop.

Conéctate por SSH a tu servidor y simplemente ejecuta:

top

Mira fijamente la segunda línea del encabezado (donde dice Tasks). Al final de esa línea verás un contador específico:

Tasks: 115 total, 1 running, 114 sleeping, 0 stopped, 0 zombie

Si el número final es mayor que 0, tienes procesos zombies merodeando en el sistema.

2. ¿Cómo identificar cuáles son esos procesos?

Para ver la lista exacta de los procesos que se encuentran en este estado fantasmal, ejecuta el siguiente comando en tu terminal:

 
ps aux | awk '{ print $8 " " $2 " " $11 }' | grep -w Z

¿Qué significa el resultado?

Este comando filtrará tus procesos y te mostrará una estructura similar a esta:

 
Z 14523 [php-fpm] <defunct>
  • Z: Significa que el estado del proceso es, efectivamente, Zombie.

  • 14523: Es el número de PID (Identificador del proceso). ¡Anota este número!

  • [php-fpm] : Te indica el nombre de la aplicación que falló (en este ejemplo, un script de PHP). La palabra <defunct> es la etiqueta oficial de Linux para un proceso muerto.

3. ¿Cómo "matar" un proceso zombie de forma correcta?

Aquí viene el truco técnico: No puedes matar a un zombie directamente. Si intentas ejecutar el comando clásico para forzar el cierre (kill -9 14523), el sistema operativo lo ignorará, porque técnicamente el proceso ya está muerto.

Para deshacerte de él, tienes que obligar al proceso padre a limpiar el desorden, o bien eliminar al padre directamente.

Paso A: Encontrar al proceso padre (PPID)

Ejecuta el siguiente comando reemplazando PID_DEL_ZOMBIE por el número que descubriste en el punto anterior (en nuestro ejemplo, 14523):

ps -o ppid= -p PID_DEL_ZOMBIE

El resultado te devolverá un nuevo número de identificación (por ejemplo, 1201). Ese es el PID del proceso padre (PPID).

Paso B: Enviar la señal de limpieza al padre

Primero, dile amablemente al proceso padre que limpie a sus hijos terminados enviándole una señal CHLD (Child):

 
kill -s SIGCHLD PID_DEL_PADRE

(Reemplaza PID_DEL_PADRE por el número que obtuviste en el Paso A, ej: 1201). Vuelve a revisar con top para ver si el zombie desapareció.

Paso C: Eliminar al proceso padre (Último recurso)

Si el paso anterior no funcionó porque el proceso padre está completamente congelado o mal programado, no queda otra opción que terminar con el padre. Esto eliminará automáticamente al zombie:

 
kill -9 PID_DEL_PADRE

Advertencia importante: Ten mucho cuidado antes de ejecutar un kill -9 al proceso padre. Si el padre es un servicio crítico de tu servidor (como el servidor web Apache o tu motor de bases de datos), el servicio se detendrá temporalmente y tus páginas web podrían quedar fuera de línea unos segundos hasta que el servicio se reinicie.

Si notas que tu servidor genera procesos zombies de forma masiva todos los días, suele ser un síntoma de que un script o software de tu sitio web está mal programado y no cierra las conexiones correctamente.

 


¿Fue útil la respuesta?

« Atrás