Processos Zumbis: O que são e como limpar a tabela de processos

Em servidores Linux em produção, especialmente ambientes com alto volume de requisições como WordPress, workers, cron jobs e filas, é comum encontrar processos zumbis no Linux.

Eles não consomem CPU de forma ativa, mas indicam falhas na gestão de processos e podem esgotar a tabela de processos caso se acumulem.

Neste guia técnico você vai entender:

  • O que são processos zumbis
  • Por que surgem
  • Como identificá-los
  • Como limpar a tabela de processos
  • Como evitar recorrência

O que são processos zumbis no Linux?

Um processo zumbi (defunct) é um processo que:

  • Já terminou sua execução
  • Não está mais em execução ativa
  • Permanece listado na tabela de processos
  • Aguarda o processo pai coletar seu status de saída

Quando um processo filho termina, ele envia o sinal SIGCHLD ao processo pai. O pai deve executar wait() ou waitpid() para coletar o status.

Se o pai não fizer isso, o processo entra no estado:

Z (zombie)

Por que processos zumbis aparecem?

As causas mais comuns incluem:

  • Scripts mal escritos (bash, Python, PHP CLI)
  • Aplicações que usam fork() sem chamar wait()
  • Processo pai travado
  • Serviços que ignoram SIGCHLD
  • Bugs em aplicações customizadas

Em ambientes web com PHP-FPM ou workers assíncronos, isso pode ocorrer com frequência quando há falhas no controle de subprocessos.


Como identificar processos zumbis no Linux

Usando ps

ps -eo pid,ppid,state,cmd | grep Z

Exemplo de saída:

12345  6789  Z  [php-fpm] <defunct>

Onde:

  • Z indica estado zumbi
  • PPID indica o processo pai

Verificando no top

top

Se houver processos zumbis, aparecerá algo como:

Tasks: 210 total, 1 zombie

Conferindo o limite de PIDs

cat /proc/sys/kernel/pid_max

Se muitos processos zumbis no Linux se acumularem, o servidor pode atingir esse limite e impedir a criação de novos processos.


Como limpar processos zumbis no Linux

Passo 1: Identifique o processo pai

ps -eo pid,ppid,state,cmd | grep Z

Anote o PPID.


Passo 2: Verifique o processo pai

ps -fp <PPID>

Método recomendado: reiniciar o serviço pai

Se o processo for gerenciado pelo systemd, reinicie o serviço:

systemctl restart nome-do-servico

Essa é a forma mais segura de limpar a tabela de processos.


Alternativa: enviar sinal SIGCHLD

kill -SIGCHLD <PPID>

Isso pode forçar o processo pai a coletar o status do filho.


Último recurso: matar o processo pai

kill -9 <PPID>

Quando o processo pai é encerrado, o PID 1 (systemd) assume os filhos e coleta os zumbis automaticamente.

Use com cautela em ambiente de produção.


Como evitar acúmulo de processos zumbis

Corrigir código que cria subprocessos

Sempre utilizar wait() ou waitpid() após fork().

Configurar serviços corretamente

No unit file do systemd:

Restart=always
KillMode=process

Monitorar continuamente

É possível criar alerta simples:

ps -eo state | grep -c Z

Ou integrar com ferramentas como:

  • Zabbix
  • Prometheus
  • Grafana

Diferença entre processos zumbis e processos órfãos

TipoEstá rodandoTem paiÉ problema
ZumbiNãoSimSim
ÓrfãoSimNãoNão

Processos órfãos são adotados automaticamente pelo systemd (PID 1) e não representam risco.


Quando se preocupar com processos zumbis no Linux?

Você deve investigar imediatamente se:

  • Existem dezenas ou centenas de processos zumbis
  • O número cresce continuamente
  • Serviços falham ao criar novos processos
  • O servidor atinge o limite de PID

FAQ

O que é um processo zumbi no Linux?

É um processo que já terminou sua execução, mas permanece na tabela de processos aguardando o pai coletar seu status.

Processos zumbis consomem CPU ou memória?

Não consomem CPU nem memória significativa, mas ocupam entrada na tabela de processos.

Como remover um processo zumbi?

Não é possível matar diretamente o zumbi. É necessário reiniciar ou corrigir o processo pai.

Processos zumbis podem derrubar o servidor?

Se acumularem em grande quantidade, podem atingir o limite de PIDs e impedir a criação de novos processos.

Como evitar processos zumbis?

Garantindo que aplicações tratem corretamente o sinal SIGCHLD e utilizem wait() ou waitpid()

Veja Mais:

A Arte do Troubleshooting Linux: Diagnosticando problemas complexos(Metodologia USE – Utilization, Saturation, Errors)

CPU ociosa com sistema lento: como identificar gargalos reais no servidor

OOM Killer no Linux: Por que o MySQL é morto e como evitar