SIGKILL vs SIGTERM: as duas formas de um processo morrer
SIGTERM é "por favor, encerre, você tem um momento para fazer limpeza." SIGKILL é "você está morto agora." Um é capturável; o outro não.
Ambos os sinais terminam um processo, mas diferem em cortesia e finalidade. A distinção explica muito do comportamento do CI - cancelamentos graciosos, OOM kills e processos que travam no encerramento.
SIGTERM (sinal 15)
SIGTERM é o pedido de terminação padrão e educado. Um processo pode instalar um handler para capturá-lo, esvaziar buffers, fechar conexões e sair de forma limpa. É assim que encerramentos bem-comportados funcionam. Um processo que ignora SIGTERM simplesmente continua rodando.
SIGKILL (sinal 9)
SIGKILL não pode ser capturado, bloqueado nem ignorado. O kernel remove o processo imediatamente, sem chance de fazer limpeza. É a ferramenta de último recurso - usada quando um processo precisa morrer agora, inclusive pelo out-of-memory killer.
O padrão de escalonamento
Orquestradores e o timeout normalmente enviam SIGTERM primeiro, esperam um período de graça e então escalam para SIGKILL se o processo não saiu. Então um processo que trava durante o encerramento gracioso é morto à força - por isso um encerramento lento pode transformar uma parada esperada em um kill forçado.
timeout --signal=TERM --kill-after=10s 60s ./long-taskComo aparecem no CI
- SIGTERM → exit 143, geralmente cancelamento, timeout ou preempção.
- SIGKILL → exit 137, geralmente o OOM killer.
- Um 143 seguido de um 137 significa que o período de graça expirou.
Principais conclusões
- SIGTERM (15) é capturável e permite limpeza graciosa.
- SIGKILL (9) é imediato, não capturável e final.
- As ferramentas enviam TERM primeiro e escalam para KILL após um período de graça.
- No CI: TERM → exit 143, KILL → exit 137.