Procesos zombis en Linux: Encontrar, Eliminar, Prevenir

15 min de lectura - 19 de mayo de 2026

hero section cover
Tabla de contenidos
  • Procesos zombis en Linux: cómo encontrarlos y eliminarlos
  • Por qué son importantes los procesos zombis en los servidores
  • Cómo encontrar procesos zombis
  • Cómo eliminar procesos zombis
  • Prevención de procesos zombis
  • Conclusión
Compartir

Aprenda a identificar, eliminar y prevenir procesos zombis en Linux. Comandos, correcciones de código y consejos de supervisión para administradores de servidores.

Procesos zombis en Linux: cómo encontrarlos y eliminarlos

Un proceso zombi es un proceso hijo que ha terminado de ejecutarse pero que sigue ocupando un espacio en la tabla de procesos del kernel. Existe porque el proceso padre no ha llamado a wait() para recoger su estado de salida. Los zombis no consumen CPU ni memoria, pero cada uno ocupa un PID. Si se acumulan en cantidad suficiente, el sistema no podrá generar nuevos procesos. Esta entrada explica cómo detectarlos, eliminarlos y evitar que aparezcan en primer lugar.


 

Por qué son importantes los procesos zombis en los servidores

Un solo proceso zombi es inofensivo. El problema surge cuando se acumulan. Linux tiene un espacio de PID finito: 32 768 en sistemas de 32 bits y hasta 4 194 304 en sistemas de 64 bits. Si los procesos zombis llenan la tabla de procesos, el kernel no puede crear nuevos procesos. Eso significa que no hay nuevas conexiones, ni nuevos subprocesos de trabajo, ni nada nuevo.

Los servidores web como Apache y Nginx están especialmente expuestos porque crean procesos hijos para gestionar el tráfico. Las pruebas de rendimiento han demostrado una caída del 48 % en el rendimiento cuando los procesos zombi se acumulan en un servidor web con mucha actividad. En 2019, una fuga de canal de Golang en un pod DNS de Kubernetes creó más de 26 000 procesos zombi en un solo nodo, llenando la tabla de procesos y provocando un fallo en la resolución de DNS en todo el clúster.

La tabla siguiente muestra las diferencias clave entre un proceso normal y un zombi:

CaracterísticaProceso normalProceso zombi
Símbolo de estadoR, S, D o TZ (inactivo)
CPU / MemoriaUso activo0 % / 0 (ya finalizado)
Entrada en la tabla de procesosUna ranuraUna ranura
Respuesta a kill -9Se termina inmediatamenteSin efecto (ya inactivo)
Memoria del núcleoDescriptor de proceso completoSolo estado de salida mínimo

La conclusión fundamental: no se puede kill -9 un zombi. Ya está muerto. La única forma de eliminarlo es hacer que el proceso padre lo recoja, o matar al padre para que init (PID 1) lo herede y lo recoja automáticamente.

Cómo encontrar procesos zombis

Los procesos zombis aparecen con una Z en la columna STAT y <defunct> junto al nombre del comando. Enuméralos con:

ps aux | grep -w Z

Para ver el ID del proceso padre (PPID), que necesitarás para eliminarlos:

ps -eo pid,ppid,stat,comm | grep -w Z

El top comando también muestra el recuento total de procesos zombis en su línea de encabezado. Para una comprobación rápida no interactiva:

top -bn1 | grep zombie

Rastrear el proceso padre con pstree

Una vez que tengas el PID de un proceso zombi, rastrea hasta el proceso padre responsable:

pstree -p -s <zombie_pid>

Esto muestra el árbol genealógico completo desde init hasta el zombi. Si pstree no está instalado, ps auxf ofrece una vista de árbol ASCII similar.

Recuento de zombis para la supervisión

Un recuento limpio que excluye el propio proceso de grep:

ps aux | awk '$8 ~ /Z/ {count++} END {print count+0}'

Para la supervisión continua durante la resolución de problemas:

watch -n 1 'ps aux | grep -w Z | wc -l'

Cómo eliminar procesos zombis

Los procesos zombis solo se pueden eliminar recopilando su estado de salida. Eso significa trabajar a través del proceso padre.

1. Encuentra el proceso padre.

ps -o ppid= -p <zombie_pid>

2. Indique al proceso padre que elimine a sus procesos hijos.

kill -SIGCHLD <parent_pid>

Esto le indica al proceso padre que llame wait() a cualquier hijo que haya finalizado. Es un proceso no disruptivo y funciona con aplicaciones que se comportan correctamente.

3. Si SIGCHLD no funciona, reinicia el servicio.

systemctl restart <service_name>

4. Si el proceso padre no responde, elimínalo.

kill <parent_pid>

O si ignora SIGTERM:

kill -9 <parent_pid>

Cuando el proceso padre muera, init (PID 1) o systemd adopta los zombis huérfanos y los elimina inmediatamente. Ten cuidado en los sistemas de producción. Terminar el proceso padre también termina todos sus procesos hijos activos.

5. Verifica la limpieza.

ps aux | awk '$8 ~ /Z/ {count++} END {print count+0}'

Si el recuento es 0, ya está todo listo.

Prevención de procesos zombis

Gestiona los procesos hijos en tu código

La causa principal de la mayoría de las acumulaciones de procesos zombis es un proceso padre que nunca llama a wait(). Solucionalo en el origen:

  • C: Configura signal(SIGCHLD, SIG_IGN); para descartar automáticamente la información de salida de los procesos hijos, o utiliza un controlador de señales con waitpid(-1, NULL, WNOHANG) para recogerlos de forma asíncrona.
  • Python: Utilice subprocess.run(), que espera automáticamente. Si se utiliza Popen, llama a proc.wait() explícitamente.
  • Bash: Añade wait al final de los scripts que inician tareas en segundo plano.

Configure systemd correctamente

Para los servicios gestionados por systemd, estos ajustes evitan la acumulación de procesos zombis:

  • KillMode=control-group asegura que todos los procesos hijos se terminen juntos cuando el servicio se detiene.
  • TimeoutStopSec da tiempo al proceso padre para recoger a los hijos antes de que systemd envíe SIGKILL.
  • WatchdogSec reinicia automáticamente los servicios que no responden, detectando los casos en los que el proceso padre se cuelga y deja de eliminarlos.

Supervisa tu tabla de procesos

Configure una tarea cron que se ejecute cada 15 minutos para contar los procesos zombis y alertar si el recuento supera un umbral:

ps aux | awk '$8 ~ /Z/' | wc -l

Supervise también el uso de su tabla de procesos comparando el recuento actual con /proc/sys/kernel/pid_max. Si supera el 80 %, investiga antes de que se convierta en un problema. Unos pocos procesos zombis transitorios durante el funcionamiento normal no son motivo de preocupación. Un recuento creciente que no vuelve a bajar a cero apunta a un error de la aplicación que hay que corregir.

Conclusión

Los procesos zombis son procesos muertos que no se han eliminado. No consumen CPU ni memoria, pero ocupan PID, y una tabla de procesos llena impide que el servidor realice ninguna tarea útil.

  • Encuéntralos con ps aux | grep -w Z y rastrea el proceso padre con pstree.
  • Elimínalos enviando SIGCHLD al proceso padre, reiniciando el servicio o matando al proceso padre como último recurso.
  • Prevé su aparición escribiendo código que llame a wait(), configurando systemd correctamente y supervisando su tabla de procesos.

Si estás ejecutando cargas de trabajo de alto tráfico y necesitas una infraestructura fiable con acceso root completo, los servidores dedicados de FDC te ofrecen un control total sobre la gestión de procesos y la configuración del sistema.

Blog

Destacados de la semana

Más artículos
Procesos zombis en Linux: Encontrar, Eliminar, Prevenir

Procesos zombis en Linux: Encontrar, Eliminar, Prevenir

Aprenda a identificar, eliminar y prevenir procesos zombis en Linux. Comandos, correcciones de código y consejos de supervisión para administradores de servidores.

15 min de lectura - 19 de mayo de 2026

Lista de comprobación para el refuerzo de servidores Linux

15 min de lectura - 8 de mayo de 2026

Más artículos