Entendendo Sinais do Linux - SIGTERM vs SIGKILL
O Que Você Vai Aprender
- A diferença e uso adequado de
SIGTERM,SIGKILLeSIGHUP - 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 -9reflexivamente — é 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+C→SIGINT,Ctrl+Z→SIGTSTP - Comandos
kill/pkill: enviam qualquer sinal para qualquer processo - Kernel / outros processos:
SIGKILLsob pressão de memória (OOM Killer),SIGSEGVem 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.
Apenas SIGKILL e SIGSTOP não podem ser capturados, ignorados ou bloqueados por um processo.
O kernel encerra o processo sem nunca executar seus handlers, então nenhum código de limpeza é executado.
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 comfg/bg.SIGSTOP(19) /SIGCONT(18): Pausa e retoma um processo. ComoSIGKILL,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 |