Estados de Processo e Ciclo de Vida no Linux: R, S, D, T, Z Explicados

Estados de Processo e Ciclo de Vida no Linux: R, S, D, T, Z Explicados

O Que Você Vai Aprender

  • O que R / S / D / T / Z na coluna STAT do ps realmente significam
  • O ciclo de vida de um processo do fork ao exit
  • Uma forma clara de diagnosticar "o zumbi não sai" ou "kill -9 não está matando"

Resumo Rápido

  • Um estado em ps é um código de uma letra para o estado interno do kernel
  • R=executando/pronto para executar, S=dormindo com interrupção, D=dormindo sem interrupção, T=parado, Z=zumbi
  • Um zumbi é finalizado mas ainda não coletado pelo pai — não é um processo, mas uma limpeza incompleta

Premissas (ambiente)

  • Um sistema Linux típico (procps ps / top)
  • Verificar códigos de estado na coluna STAT de ps aux ou via ps -eo stat

O Que É um Estado de Processo?

Conclusão: Um estado de processo é a classificação interna do kernel sobre como está tratando um processo neste momento (executar na CPU, fazer esperar, parar, aguardar coleta). O ps projeta isso em uma única letra.

Do nascimento à morte, todo processo Linux está sempre em um estado. O estado é um atributo interno que o kernel gerencia para escalonamento — distingue "este processo é elegível para a CPU", "está esperando por algo" e "já terminou".

O código de estado exibido por ps e top é esse estado interno mapeado em um caractere. Comece observando o quadro geral com ps.

$ ps -eo pid,stat,comm
  PID STAT COMMAND
    1 Ss   systemd
  812 S    sshd
 1043 R+   ps
 1044 S+   bash
 2210 Z    defunct

O primeiro caractere de STAT é o estado principal; caracteres seguintes são flags auxiliares (abordadas abaixo). A linha cujo COMMAND é defunct é um zumbi.

R / S / D - Qual a Diferença Entre Executando e Dormindo?

Conclusão: R está em uma CPU (ou esperando sua vez), S é uma espera com interrupção, D é uma espera sem interrupção. Um número crescente de processos em D aponta para I/O travado.

Os estados mais vistos são R para execução e S / D para espera.

  • R (Running / Runnable): Executando em uma CPU, ou aguardando na fila de execução por uma vez. Um processo que "pode executar".
  • S (Interruptible Sleep): Aguardando algum evento (entrada, um timer, recebimento de socket). Pode ser interrompido por um sinal. A maioria dos processos em um desktop ou servidor fica em S na maior parte do tempo.
  • D (Uninterruptible Sleep): Principalmente aguardando conclusão de baixo nível como I/O de disco. Não pode ser interrompido, nem mesmo por um sinal. Normalmente passa em um instante, mas um número crescente de processos travados em D é um sinal de alerta (falha de armazenamento, montagem NFS sem resposta, etc.).
# Extrair apenas processos em estado D (aguardando I/O)
$ ps -eo pid,stat,comm | awk '$2 ~ /D/'

Um processo em D não aceita sinais, então nem kill -9 irá matá-lo imediatamente. A maioria dos "executei kill -9 mas não foi embora" são ou este D (espera de I/O) ou um zumbi (Z). Você precisa aguardar o I/O subjacente terminar.

T / t - O Que É um Processo Parado?

Conclusão: T é um processo suspenso por SIGSTOP / Ctrl+Z, t é um parado sob rastreamento de depurador. Ambos não usam CPU e aguardam ser retomados.

  • T (Stopped): Suspenso via controle de job. Iniciado por Ctrl+Z (SIGTSTP) ou kill -STOP. Retome com fg / bg ou SIGCONT.
  • t (Tracing stop): Parado sob um depurador como gdb ou strace.
$ sleep 300 &
$ kill -STOP %1     # suspender → STAT vira T
$ ps -o pid,stat,comm -p $(pgrep -n sleep)
  PID STAT COMMAND
 3120 T    sleep
$ kill -CONT %1     # retomar → volta para S

T não significa "morto" — significa "suspenso, aguardando retomada". Para encerrá-lo, envie SIGCONT para retomar primeiro, depois SIGTERM (um processo parado pode não processar TERM enquanto suspenso).

O Que É um Zumbi (Z), e Por Que Ele Não Morre?

Conclusão: Um zumbi (Z / defunct) terminou mas seu pai ainda não coletou (reap) seu status de saída. O corpo foi embora; só resta uma entrada na tabela de processos.

Quando um processo chama exit(), ele não desaparece imediatamente. O kernel mantém seu status de saída (código de saída) e aguarda o pai vir buscá-lo. Este estado de espera-para-ser-coletado é um zumbi, mostrado como Z em ps e <defunct> na coluna COMMAND.

As propriedades principais de um zumbi:

  • Sua memória, arquivos e CPU já foram liberados. Só resta uma entrada na tabela de processos (seu PID e status de saída).
  • Por ser "já morto", você não pode matá-lo (não há processo vivo para receber um sinal).
  • Ele desaparece no instante em que o pai chama wait() / waitpid() (coletando-o).
# Extrair apenas zumbis
$ ps aux | awk '$8 ~ /Z/ { print $2, $11 }'

Alguns zumbis são inofensivos, mas um monte deles indica um bug no pai (falha em chamar wait em seus filhos). PIDs são um recurso finito, então zumbis que esgotam o espaço de PIDs podem impedir a criação de novos processos.

Órfão vs Zumbi - Qual a Diferença?

Conclusão: Um órfão é um processo vivo cujo pai morreu primeiro; ele é adotado pelo PID 1 (init / systemd). Um zumbi é um processo morto. Órfãos são normais; zumbis persistentes não são.

Processos órfãos são facilmente confundidos com zumbis, mas são quase opostos.

Aspecto Órfão Zumbi (Z)
Vivo? Vivo Morto (já saiu)
Causa Pai saiu primeiro Pai não está chamando wait
Adotado por PID 1 (init/systemd) Coletado pelo pai (ou PID 1)
É problema? Normalmente inofensivo Bug no pai se houver muitos

Quando um pai sai antes de seu filho, o filho se torna um órfão e é automaticamente re-parenteado para o PID 1 (init ou systemd). O PID 1 chama wait periodicamente, então quando esse órfão sair depois, ele é coletado imediatamente e nunca fica como zumbi. Isso faz parte de como um processo com nohup ou daemonizado continua rodando depois de fechar o terminal.

# Um PPID de 1 significa um órfão (adotado pelo PID 1)
$ ps -eo pid,ppid,stat,comm | awk '$2 == 1'

Do fork ao exit - O Ciclo de Vida do Processo

Conclusão: Um processo é duplicado pelo fork, substitui sua imagem com exec, alterna entre executando (R/S/D) e parado (T), sai, e é completamente removido quando o pai o coleta. Um zumbi é este último passo deixado incompleto.

Conectando os estados como um ciclo de vida, a vida de um processo tem esta aparência.

  1. fork(): O pai cria um filho como uma cópia de si mesmo. Logo após, o filho é quase idêntico ao pai.
  2. exec(): O filho substitui sua imagem de memória por outro programa (fork + exec é o padrão básico para iniciar um novo comando).
  3. Executando e esperando: Sob o escalonador, ele move entre R (executando) ⇄ S / D (esperando) ⇄ T (parado) enquanto faz seu trabalho.
  4. exit(): O programa encerra. Deixando seu status de saída para trás, ele se torna um zumbi (Z) e aguarda coleta pelo pai.
  5. wait() / waitpid(): O pai coleta o status de saída do filho (reap). Nesse instante o zumbi desaparece e o PID é liberado.

Esse modelo explica sintomas comuns em uma única linha.

  • Um zumbi persistente → o passo 5 está faltando (o pai não está chamando wait)
  • Um órfão → o pai saiu antes do passo 4 → PID 1 assume
  • kill -9 não mata → ou D no passo 3 (espera de I/O), ou já é um zumbi do passo 4
# Contar processos aproximadamente por estado
$ ps -eo stat --no-headers | cut -c1 | sort | uniq -c | sort -rn
    142 S
     12 I
      4 R
      1 Z

Como Ler as Flags Auxiliares de STAT

Conclusão: Caracteres após o primeiro em STAT são auxiliares. + é um job em primeiro plano, s um líder de sessão, l multi-threaded, < / N prioridade. Leia-os junto com a letra principal de estado.

Valores de STAT como Ss ou R+ têm dois ou mais caracteres porque flags auxiliares seguem o estado principal. As principais:

Flag Significado
s Líder de sessão
l Multi-threaded
+ No grupo de processos em primeiro plano
< Alta prioridade (valor nice negativo)
N Baixa prioridade (valor nice positivo)
L Tem páginas bloqueadas na memória

Por exemplo, Ss do systemd se lê como "dormindo com interrupção (S) e líder de sessão (s)", enquanto R+ do próprio ps se lê como "executando (R) e um job em primeiro plano (+)".

Quando você quer contar por apenas a letra principal, extraia o primeiro caractere com ps -eo stat | cut -c1 para ignorar as flags auxiliares (o exemplo de contagem acima usa este truque).

Resumo: Tabela de Referência de Códigos de Estado

Conclusão: R pode executar, S/D estão esperando (D sem interrupção), T está parado, Z é zumbi. A armadilha prática é que zumbis e processos D não podem ser limpos com kill.

Código Estado Significado Pode matar?
R Running / Runnable Na CPU ou fila de execução Sim
S Interruptible sleep Aguardando evento (normal) Sim
D Uninterruptible sleep Aguardando I/O Não (espera de I/O)
T Stopped Ctrl+Z / SIGSTOP Após CONT retomá-lo
Z Zombie Saiu, aguardando coleta Não (tratar o pai)

Quando você consegue ler os estados, sintomas vagos como "está pesado", "não termina" ou "não morre" se traduzem na questão concreta de o que o kernel está fazendo com aquele processo. Aprenda isso junto com como enviar sinais, e a resolução de problemas de processos fica notavelmente mais rápida.

Próximas Leituras