Entendendo Sinais do Linux - SIGTERM vs SIGKILL

Entendendo Sinais do Linux - SIGTERM vs SIGKILL

O Que Você Vai Aprender

  • A diferença e uso adequado de SIGTERM, SIGKILL e SIGHUP
  • Uma resposta fundamentada para "devo usar apenas kill -9?"
  • Uma forma clara de diagnosticar por que um processo "não morre" ou "não recarrega sua configuração"

Resumo Rápido

  • Tente primeiro kill (= SIGTERM) para parar o processo graciosamente
  • Se não responder, use kill -KILL (= SIGKILL) para forçar
  • Não use kill -9 reflexivamente — é o último recurso que pula a limpeza

O Que É um Sinal?

Conclusão: Um sinal é uma notificação assíncrona que o kernel envia a um processo, dizendo para encerrar, parar, recarregar, etc.

Um sinal é uma interrupção de software assíncrona enviada a um processo, geralmente pelo kernel. Ele carrega uma mensagem curta — "por favor, encerre", "por favor, pare" — codificada como um número, e é uma das formas mais leves de comunicação entre processos (IPC).

Os sinais chegam por três caminhos principais.

  • Teclado: Ctrl+CSIGINT, Ctrl+ZSIGTSTP
  • Comandos kill / pkill: enviam qualquer sinal para qualquer processo
  • Kernel / outros processos: SIGKILL sob pressão de memória (OOM Killer), SIGSEGV em acesso inválido à memória

Liste os sinais disponíveis com kill -l.

$ kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
...

Os números de sinal não são todos fixos. Os mais baixos — SIGHUP(1), SIGINT(2), SIGKILL(9), SIGTERM(15) — são estáveis, mas outros como SIGUSR1 variam por arquitetura. Em scripts, prefira o nome (-TERM, -KILL) ao número.

O Que É SIGTERM e Por Que É o Padrão?

Conclusão: SIGTERM (15) pede educadamente a um processo para sair. O processo pode capturá-lo, fazer limpeza (salvar arquivos, fechar conexões) e então sair. É o padrão para kill.

SIGTERM (número 15) é o sinal que kill envia quando você não especifica um.

# Esses dois são equivalentes
$ kill 12345
$ kill -TERM 12345

A propriedade-chave do SIGTERM é que um processo pode capturá-lo. Antes de sair, o processo pode realizar limpeza:

  • Salvar arquivos sendo editados
  • Fechar conexões de banco de dados e sockets
  • Deletar arquivos temporários
  • Notificar processos filhos para encerrar

Isso é um graceful shutdown, e é exatamente por isso que o systemd envia SIGTERM primeiro ao parar um serviço.

Ao parar processos que lidam com dados (bancos de dados, editores, servidores de aplicação), sempre tente SIGTERM primeiro. Forçar o encerramento imediatamente arrisca corrupção de dados.

O Que É SIGKILL e Como Ele Difere do SIGTERM?

Conclusão: SIGKILL (9) faz o kernel destruir um processo instantaneamente. Não pode ser capturado, ignorado ou bloqueado, e nenhuma limpeza é executada — um verdadeiro último recurso.

SIGKILL (número 9) é o encerramento forçado por trás do familiar kill -9. A diferença decisiva do SIGTERM se resume a um ponto.

Isso significa que kill -9 tem efeitos colaterais:

  • Dados não salvos são perdidos
  • Arquivos abertos e sockets não são fechados corretamente
  • Arquivos temporários e de lock ficam para trás
  • Processos filhos tornam-se órfãos

O OS recupera parte disso, mas a consistência no nível da aplicação não é garantida.

Aspecto SIGTERM (15) SIGKILL (9)
Capturável? Sim Não
Limpeza executa? Sim Não
Dados salvos? Provavelmente Não
Quando usar Parada normal Quando TERM falha

Evite começar com kill -9. "Não para, então use -9" tende a esconder a causa real (deadlock, espera de I/O) enquanto joga fora dados. Mantenha a ordem: SIGTERM primeiro, aguarde alguns segundos, então SIGKILL se necessário.

O Que É SIGHUP e Seu Uso Além do Encerramento

Conclusão: SIGHUP (1) originalmente significava "o terminal desconectou", mas daemons o reutilizam por convenção como um gatilho de "recarregue seu arquivo de configuração".

SIGHUP (número 1, "hang up", desligar) era originalmente enviado quando o terminal de controle era desconectado. Feche um terminal, e os processos iniciados lá recebem SIGHUP e, por padrão, encerram. O comando nohup existe precisamente para ignorar SIGHUP e continuar em execução.

Separadamente, muitos daemons interpretam SIGHUP à sua maneira: como um sinal para recarregar o arquivo de configuração sem reiniciar.

# Dizer ao nginx para recarregar sua configuração (sem parar o processo)
$ kill -HUP $(cat /var/run/nginx.pid)

Esse comportamento de "recarga" não faz parte da especificação do sinal — é uma convenção que cada daemon implementa. O comportamento varia por programa, então sempre verifique a documentação oficial sobre como ele lida com SIGHUP.

SIGINT, SIGSTOP e Outros Sinais Importantes

Conclusão: Os sinais do dia a dia são SIGINT (Ctrl+C) e SIGTSTP (Ctrl+Z). SIGSTOP / SIGCONT são não capturáveis e pausam/retomam um processo.

Conheça os sinais que você vai encontrar com mais frequência em um terminal.

  • SIGINT (2): Ctrl+C. "Interrupt" (interromper). Encerra por padrão mas é capturável (é por isso que muitas CLIs exibem um prompt de confirmação).
  • SIGTSTP (20): Ctrl+Z. Suspende o job em primeiro plano; retome com fg / bg.
  • SIGSTOP (19) / SIGCONT (18): Pausa e retoma um processo. Como SIGKILL, SIGSTOP é não capturável.
  • SIGQUIT (3): Ctrl+\. Encerra mais um core dump.

O tratamento de jobs suspensos com Ctrl+Z é abordado em detalhes em Fundamentos de Controle de Jobs.

Enviando Sinais na Prática: kill / pkill / killall

Conclusão: Use kill para um PID, pkill / killall para um nome. Para evitar erros, confirme os alvos com pgrep antes de enviar.

Há três comandos comuns para enviar sinais.

# Enviar para um PID específico (a forma básica)
$ kill -TERM 12345

# Enviar pelo nome do processo (correspondência parcial)
$ pkill -TERM nginx

# Enviar pelo nome do processo (correspondência exata, killall)
$ killall -TERM nginx

pkill / killall enviam para todos os processos correspondentes. Para evitar capturar processos não intencionais, sempre confirme os alvos com pgrep -a <nome> primeiro.

$ pgrep -a nginx

Para expressar "TERM primeiro, depois KILL" em uma linha, insira uma espera entre eles.

$ kill -TERM 12345; sleep 5; kill -KILL 12345 2>/dev/null

Resumo: Guia Rápido de Sinais

Conclusão: SIGTERM para parada graciosa, SIGKILL como último recurso, SIGHUP para recarregar configuração. Especifique pelo nome, não pelo número, e reserve o force-kill para o último.

Objetivo Sinal Exemplo
Parar normalmente SIGTERM kill <PID>
Simplesmente não para SIGKILL kill -KILL <PID>
Recarregar config SIGHUP kill -HUP <PID>
Pausar / retomar SIGSTOP / SIGCONT kill -STOP / -CONT

Próxima Leitura