- Um processo zumbi é um processo filho finalizado que permanece na tabela de processos porque seu processo pai não chamou wait().
- Eles são detectados com comandos como ps e top, onde aparecem com o status Z ou rotulados como .
- Eles não consomem CPU, mas muitos processos zumbis podem preencher a tabela de processos e causar problemas sérios.
- A limpeza adequada envolve forçar o processo pai a coletar o estado do processo filho, usando sinais como SIGHUP ou SIGCHLD.
No mundo do GNU/Linux e outros sistemas UNIX, falar sobre processos zumbis não tem nada a ver com séries de TV ou filmes de terror, embora o nome seja bastante apropriado. São aqueles processos meio mortos, meio vivos, que permanecem na tabela de processos e, se acumularem, podem causar muitas dores de cabeça para o administrador do sistema.
É importante entender o que são processos zumbis, como são criados, como detectá-los no Linux (e macOS ) e, principalmente, como eliminá-los sem danificar nada importante. Abaixo, você encontrará uma explicação detalhada, combinando teoria de sistemas, exemplos práticos com comandos como `ps` e ` top` , vários métodos para encerrar esses processos mortos e até mesmo um pequeno programa em C para gerar um zumbi de teste.
O que exatamente é um processo zumbi no Linux?
Um processo zumbi (ou inativo) é um processo filho que terminou sua execução, mas ainda mantém uma entrada na tabela de processos do sistema. Essa entrada permanece para que seu processo pai possa consultar o código de saída do filho usando chamadas como `wait()` ou `waitpid()` . Até que o processo pai execute essa consulta, o filho não desaparece completamente.
Do ponto de vista metafórico, a criança morreu, mas sua "alma" permanece registrada no sistema. É por isso que são chamados de zumbis ou processos mortos: eles não executam mais código, não consomem CPU nem memória do usuário, mas ocupam um pequeno espaço na tabela de processos. Um ou dois não fazem mal, mas se um aplicativo mal programado gerar muitos, podemos ter problemas.
Em sistemas Unix e Linux, quando um processo termina, o kernel libera seus recursos (memória, descritores de arquivo, etc.), mas retém um registro mínimo de seu estado de saída. Se o processo pai nunca chamar `wait()` , esse registro não será apagado e o processo permanecerá marcado como zumbi. Isso quase sempre é um problema de programação ou de projeto no software que atua como processo pai.
Esses processos são facilmente reconhecidos porque em ferramentas como o ps eles aparecem com o status Z (de zumbi) ou com o rótulo <defunct> , e em monitores como o top existem contadores específicos que mostram quantos zumbis temos ativos no sistema em um determinado momento.

Estados de processo no Linux
Para entender o papel dos processos zumbis, é útil revisar os estados de processo mais comuns no Linux. Quando listamos os processos com `ps` ou `top` , uma letra é usada para indicar o estado:
- Dormir (S)Processos em estado de repouso, aguardando sua vez de executar ou a ocorrência de algum evento.
- Correndo (R)Processos que estão sendo executados na CPU ou prontos para serem executados.
- Esperando (D): processos bloqueados aguardando a conclusão de uma operação de entrada/saída (espera ininterrupta).
- Parado (T)Processos interrompidos, por exemplo, por sinais como SIGSTOP ou porque estão em modo de depuração.
- Zumbi (Z): processos que terminaram, mas continuam aparecendo na tabela de processos aguardando que seu processo pai leia seu status de saída.
Cada linha em `ps` mostra um processo com seu PID, PPID (PID pai), usuário, status e outros dados. O campo de status pode ser nomeado como S , STAT ou algo similar, dependendo dos parâmetros de `ps`. Um processo com status Z é, oficialmente, um zumbi. Em muitos casos, o nome do processo ou comando será exibido como <defunct> , deixando claro que ele está inativo.
Como detectar processos zumbis no Linux a partir do terminal
A maneira mais direta de localizar processos zumbis é usar comandos clássicos de monitoramento: ps e top . Combiná-los com ferramentas como grep , awk ou xargs permite filtrar e preparar listas de PIDs com considerável precisão.
Um dos comandos mais usados para ver zumbis é:
ps -el | grep 'Z'
O parâmetro `-el` faz com que o `ps` exiba uma saída estendida, onde a segunda coluna normalmente indica o status do processo. Nessa coluna, podemos encontrar, entre outras coisas:
- S: dormindo.
- R: correndo.
- D: aguardando (espera ininterrupta).
- T: parado ou gestopt (suspenso).
- Z: zumbi (extinto).
Para um exemplo mais detalhado, em uma máquina com processos problemáticos, poderíamos obter algo como:
ps -el | grep 'Z'
FS UID PID PPID C PRI NI ADDR SZ WCHAN TTY TEMPO CMD
1 Z 0 1213 589 0 75 0 – 0 funct> ? 00:00:00 dovecot-auth
Aqui vemos que o processo dovecot-auth está marcado com o estado Z, portanto é um processo zumbi. Observe também a coluna PPID , pois esse é o PID do processo pai, que discutiremos mais adiante para limpar adequadamente o processo zumbi.
Outra forma muito comum de listar zumbis é usar a combinação:
ps -A -ostat,ppid,pid,cmd | grep -e '^'
Neste caso, a opção -A lista todos os processos e a opção -o permite definir exatamente quais colunas queremos: status (stat), PPID, PID e o comando. O filtro grep -e '^' inclui apenas linhas cujo status começa com Z oz, ou seja, processos zumbis.
Outra opção, um pouco mais minimalista, seria:
ps axo pid=,stat= | awk '$2~/^Z/ { imprimir $1 }'
Nesta versão, solicitamos apenas o PID e o status, sem cabeçalhos (usando `pid=,stat=` ), e então, com `awk`, filtramos as linhas cujo campo de status começa com Z, imprimindo apenas o PID do processo zumbi. É uma maneira elegante de gerar uma lista de PIDs de processos zumbis para uso posterior com `kill` ou outros pipelines.

Usando o comando `top` para localizar processos zumbis.
O comando `top` é uma ferramenta interativa muito conveniente para visualizar o que está acontecendo no sistema em tempo real. O cabeçalho do ` top` exibe um resumo mostrando o número total de tarefas e quantas estão em cada estado, incluindo o número de processos zumbis ativos .
Para usá-lo, basta executar:
top
Na primeira ou segunda linha, você verá algo como: Tarefas: 150 no total, 1 em execução, 149 em repouso, 0 paradas, 1 zumbi . Esse contador de zumbis indica se ainda existem processos mortos consumindo recursos do sistema. Além disso, ao rolar a lista de processos, na coluna S (estado) , você pode localizar facilmente aqueles marcados com um Z.
Uma limitação do `top` é que, embora indique o número de processos zumbis, nem sempre é tão conveniente quanto o `ps` para extrair apenas esses processos. Portanto, é muito comum combiná-los: primeiro, o `top` verifica a existência de processos zumbis e, em seguida, o `ps` é usado com os filtros que vimos para identificá-los em detalhes e preparar os comandos para eliminá-los.
Alguns artigos também sugerem outro comando específico para visualizar processos inativos com mais informações:
ps axo stat,ppid,pid,comm | grep -w defunct
Este comando concentra-se em processos cujo comando está marcado como inativo ; novamente, você verá o status, o PID do processo pai, o PID do processo filho e o comando associado, o que facilita muito o rastreamento do problema até o processo pai.

O que acontece no kernel com um processo zumbi?
No nível interno do kernel do Linux, cada processo é representado por uma estrutura de dados chamada `struct task_struct` . Dentro dessa estrutura, existem campos que indicam o estado do processo, incluindo `exit_state` , onde o estado de saída é armazenado quando o processo termina.
Quando um processo termina, o kernel marca esse processo com um valor como EXIT_ZOMBIE (definido nos cabeçalhos do kernel) no campo `exit_state` . Isso significa que o processo já terminou, mas ainda está aguardando que seu processo pai recupere as informações de saída. Até que o processo pai execute `wait()` , o kernel não altera esse estado nem remove completamente a entrada da tabela de processos.
O detalhe interessante é que, embora um processo zumbi não consuma CPU ou memória de trabalho de forma significativa, ele ocupa um espaço na tabela de processos . E essa tabela tem um tamanho finito. Se um aplicativo estiver criando processos filhos em um loop que nunca são finalizados (porque o processo pai não chama wait()), podemos acabar com centenas ou milhares de processos zumbis, esgotando a capacidade da tabela e causando falhas na criação de novos processos.
Como encerrar processos zumbis no Linux
Uma vez detectados os processos zumbis, precisamos pensar em como "eliminá-los" efetivamente. Aqui está um ponto crucial: o processo zumbi já está morto , no sentido de que não está mais em execução. Portanto, enviar sinais como SIGKILL (kill -9) diretamente para o zumbi é inútil; não há código para responder a esse sinal.
O que realmente precisa ser feito é fazer com que o processo pai leia o estado de saída do processo filho . Isso pode ser alcançado de várias maneiras: enviando sinais apropriados ao processo pai, forçando o processo pai a terminar (para que o init ou o systemd possam assumir o processo zumbi e limpá-lo) ou usando combinações de comandos que automatizam essa tarefa.
Primeira opção: enviar SIGHUP para o pai
Uma solução amplamente utilizada envolve encontrar o PPID dos processos zumbis e enviar um sinal ao processo pai para executar `wait()` e coletar os estados de seus filhos. Um comando típico é:
kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e '^' | awk '{print $2}'`
Eis o que acontece: primeiro, todos os processos são listados com seu status, PPID, PID e comando; em seguida, aqueles cujo status começa com Z são filtrados; finalmente, a segunda coluna, que é o PPID (o identificador do processo pai), é extraída usando `awk '{print $2}'` . Essa lista de PIDs pais é então passada para `kill -HUP` , que envia o sinal SIGHUP para cada um deles.
Em muitas aplicações, esse sinal faz com que o processo pai recarregue sua configuração ou execute alguma limpeza. Nesse contexto, a ideia é que o processo pai execute uma função wait() apropriada e se livre dos processos zumbis . É um método bastante agressivo, mas prático, especialmente quando há muitos processos zumbis acumulados que compartilham o mesmo processo pai.
Segunda opção: usar SIGCHLD
Outra abordagem é enviar o sinal SIGCHLD para o processo pai problemático. Esse sinal informa a um processo que um de seus filhos mudou de estado (por exemplo, terminou). Normalmente, quando um processo filho termina, o kernel envia SIGCHLD para o pai; se o pai tiver um manipulador de sinal configurado, ele geralmente chama wait() dentro desse manipulador.
Se você detectar que vários zumbis têm o mesmo PPID, você pode tentar:
matar -s SIGCHLD
Por exemplo:
matar -s SIGCHLD 2201
Isso lembra o processo pai de que ele possui processos filhos não ativos. Se o processo pai estiver programado corretamente para reagir ao sinal SIGCHLD, ele eliminará seus processos zumbis usando a função wait(). Esse método é menos abrupto do que encerrar o processo pai e, se o programa for bem escrito, é a maneira mais natural de resolver o problema.
Terceira opção: encerrar o processo pai.
Se o processo pai estiver bloqueado, não responder a sinais como SIGHUP ou SIGCHLD, ou estiver claramente travado, outra opção é encerrá-lo à força. Nesse caso, utiliza-se o método clássico:
matar -9
Por exemplo:
kill -9 2201
Ao fazer isso, o kernel encerra o processo pai. Na maioria dos sistemas modernos, o systemd ou o processo init assume o controle dos processos órfãos (incluindo os zumbis) e chama a função wait() neles, limpando assim sua entrada na tabela de processos. Não é a abordagem mais elegante, mas às vezes é a única maneira de se livrar de uma coleção de zumbis originados de um programa com defeito.
Outras combinações avançadas com ps, awk e kill
Além dos exemplos acima, existem muitos comandos de uma linha que automatizam a busca por processos zumbis e o envio de sinais aos seus processos pais. Alguns exemplos representativos são:
ps axo state,pid | awk '$1==»2″ {print $2}' | xargs kill -s SIGKILL
Este comando seleciona processos com base no valor numérico do seu estado; no entanto, é menos utilizado por ser menos legível do que trabalhar com a letra Z. Outros comandos comuns para lidar com processos zumbis são:
ps -xaw -o estado,ppid | grep Z | grep -v PID | awk '{ print $2 }' | xargs kill -9
o bem:
kill -9 `ps xawo state=,pid= | sed -n 's/Z //p'`
ou até mesmo:
kill -9 `ps -xaw -o state -o ppid | grep Z | grep -v PID | awk '{print $2}'`
Em todos os casos, a ideia é semelhante: localizar os processos no estado Z, extrair seus PIDs ou PPIDs correspondentes e aplicar o comando de finalização com o sinal apropriado (SIGHUP, SIGCHLD, SIGKILL, etc.). No entanto, esses métodos devem ser usados com cautela, pois finalizar processos importantes sem considerar as consequências pode causar falhas em serviços ou instabilidade do sistema.
Exemplo prático: criando um processo zumbi com C
Para executar testes sem danificar nada, uma técnica clássica é criar um processo zumbi de forma controlada usando um pequeno programa em C. Dessa forma, podemos ver exatamente como ele aparece no ps, como é marcado como <defunct> e praticar os comandos para removê-lo.
Um programa muito simples que gera um zumbi poderia ser este:
#incluir
#incluir
#incluir
intmain()
{
pid_t pid_filho;
child_pid = fork();
se (child_pid > 0) {
sono (60);
}
else {
saída (0);
}
0 voltar;
}
Neste código, o processo pai executa um fork() . O processo filho termina imediatamente com exit(0) , enquanto o pai permanece inativo por 60 segundos . Durante esse tempo, o processo filho está morto, mas o pai ainda não chamou wait() , então o filho permanece em um estado zumbi na tabela de processos.
Para compilar este programa, você pode usar o gcc da seguinte forma:
gcc -o zombie1 zombie.c
E para executá-lo em segundo plano, basta:
./zombie1 &
Enquanto o processo pai ainda estiver inativo, você pode executar `ps -el | grep 'Z'` ou qualquer um dos comandos acima e verá o processo zumbi em ação. Após alguns segundos, quando o processo pai terminar e o sistema concluir a limpeza, o processo zumbi desaparecerá.
Impacto dos processos zumbis e causas comuns
Um único processo zumbi isolado geralmente não é motivo de preocupação . Ele não consome CPU, a memória associada ao processo já foi liberada e o impacto direto no desempenho é mínimo. O problema surge quando muitos processos zumbis se acumulam, normalmente porque o software é mal projetado ou apresenta bugs no gerenciamento de seus processos filhos.
As causas mais frequentes de zumbis são:
- Programação ruimO processo pai cria processos filhos, mas não implementa corretamente o gerenciamento de SIGCHLD nem chama wait() ou waitpid() para coletar o estado dos filhos.
- Erros de configuraçãoAlguns serviços podem criar processos filhos em um loop sob certas configurações não previstas pelo desenvolvedor, gerando uma cascata de processos zumbis.
- O processo pai trava ou congela.Se o processo pai ficar preso em uma operação de E/S ou em um loop infinito, ele pode deixar processos filhos inativos sem serem processados.
Quando existem muitos processos zumbis, a tabela de processos pode ficar cheia de entradas mortas , dificultando a criação de novos processos e gerando sintomas como lentidão, erros ao iniciar aplicativos ou comportamento estranho em serviços críticos (por exemplo, servidores web como o Apache gerando centenas de processos mortos).
Portanto, é importante verificar periodicamente com `top` ou `ps` a presença de processos zumbis, especialmente em servidores de produção, e, acima de tudo, corrigir a causa raiz: atualizar o software problemático, corrigir o código que gerencia os processos filhos ou ajustar as configurações que estão causando a criação descontrolada de processos filhos.
Alternativas gráficas para usuários de desktop
Se você não se sente confortável usando o terminal ou simplesmente prefere uma solução visual, em muitos ambientes gráficos do Linux você pode usar o Monitor do Sistema ou ferramentas equivalentes que oferecem uma visualização gráfica dos processos.
O procedimento geral seria algo como isto:
- Abra o aplicativo Monitor de Sistema a partir do menu da sua área de trabalho.
- Vá para a guia Processos, onde todos os processos ativos são listados.
- Use a ferramenta de pesquisa (geralmente um ícone de lupa) para pesquisar termos como zumbi ou consulte a coluna de status para localizar os processos marcados como ou Z.
- Selecione o processo problemático, clique com o botão direito do mouse e escolha a opção para "Matar" ou “Fim do processo”.
Para que isso funcione corretamente, é crucial garantir que o monitor esteja exibindo todos os processos do sistema , e não apenas os do usuário atual. Geralmente, há uma caixa de seleção ou opção nas configurações que permite "Mostrar processos de todos os usuários" ou algo semelhante.
Boas práticas para prevenir a proliferação de zumbis
Além dos truques para matar zumbis depois que eles aparecem, vale a pena aplicar algumas boas práticas para minimizar a ocorrência desses processos em sistemas de produção.
Entre as recomendações mais importantes estão:
- Mantenha o sistema e o software atualizados.Frequentemente, processos zumbis são originários de bugs que já foram corrigidos em versões posteriores de um servidor ou aplicativo.
- Analise o agendamento dos processos filhos.Se você desenvolver um software que usa fork(), certifique-se de tratar o sinal SIGCHLD corretamente e chamar wait() ou waitpid() para cada processo filho que for finalizado.
- Monitore periodicamenteIncorporar comandos como ps -el, ps axo stat,ppid,pid,comm ou top em scripts de monitoramento ou ferramentas de observabilidade ajuda a detectar imediatamente picos de atividade zumbi.
- Investigue a origem do aparecimento recorrente de zumbis.Se forem sempre filhos de um serviço específico (por exemplo, um servidor de e-mail ou um daemon específico), pode ser necessário rever a sua configuração ou versão.
Em algumas ocasiões, scripts específicos (por exemplo, chamados zombi.sh ) foram publicados para automatizar toda essa lógica: eles localizam processos zumbis, identificam seus processos pai, enviam os sinais apropriados e tentam limpar a tabela de processos. Eles são úteis como último recurso quando os métodos manuais falham, mas é sempre importante saber o que eles fazem nos bastidores para evitar surpresas.
Em resumo, entender o que é um processo zumbi, como visualizá-lo com `ps` e `top` , como os sinais `SIGHUP` , `SIGCHLD` e `SIGKILL` afetam os processos pai e quais padrões de programação levam a esse estado permite diagnosticar e resolver facilmente praticamente qualquer problema relacionado a processos mortos no Linux, mantendo seus sistemas mais limpos, estáveis e com a tabela de processos sob controle.
Escritor apaixonado pelo mundo dos bytes e da tecnologia em geral. Adoro compartilhar meu conhecimento por meio da escrita, e é isso que farei neste blog, mostrar a vocês tudo o que há de mais interessante sobre gadgets, software, hardware, tendências tecnológicas e muito mais. Meu objetivo é ajudá-lo a navegar no mundo digital de uma forma simples e divertida.