O que são sinais?
Sinais são notificações assmíncronas enviadas a processos pelo kernel ou por outros processos. Cada sinal tem um número e um nome. Para listar todos os sinais disponíveis:
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 17) SIGCHLD
18) SIGCONT 19) SIGSTOP 20) SIGTSTP ...
kill PID — o básico
O comando kill envia um sinal a um processo. Sem especificar o sinal, ele envia SIGTERM (15) por padrão.
# Encerrar processo com PID 2103 (SIGTERM)
kill 2103
# Equivalente explícito
kill -15 2103
kill -SIGTERM 2103
SIGTERM vs SIGKILL vs SIGHUP
Estes são os três sinais mais usados no dia a dia:
- SIGTERM (15) — pede ao processo para encerrar. O processo pode capturar esse sinal, salvar dados e sair de forma limpa. É sempre a primeira opção.
- SIGKILL (9) — força o encerramento imediato pelo kernel. O processo não pode capturar ou ignorar esse sinal. Use apenas como último recurso.
- SIGHUP (1) — originalmente indicava que o terminal foi fechado. Muitos daemons (nginx, Apache) recarregam sua configuração ao receber SIGHUP.
# Tentativa gentil
kill 2103
# Esperar alguns segundos, se não morreu:
kill -9 2103
# Recarregar config do nginx
kill -HUP $(pgrep -f "nginx: master")
Dica: sempre tente SIGTERM antes de SIGKILL. O kill -9 não permite que o processo feche arquivos, libere locks ou salve estado — pode causar corrupção de dados.
killall e pkill
Para matar processos pelo nome em vez de PID:
# killall: mata todos os processos com esse nome exato
killall nginx
# pkill: aceita padrões (regex parcial)
pkill -f "python3 app.py"
# pkill por usuário
pkill -u www-data
# Enviar SIGHUP para o apache2
pkill -HUP apache2
# Verificar se o processo ainda existe
pgrep -a nginx || echo "Nenhum processo nginx encontrado"
Nenhum processo nginx encontrado
trap em scripts Bash
O comando trap permite que seus scripts capturem sinais e executem ações de limpeza antes de sair.
#!/bin/bash
TMPFILE=$(mktemp)
# Função de limpeza
cleanup() {
echo "Sinal recebido. Limpando..."
rm -f "$TMPFILE"
exit 0
}
# Capturar SIGTERM e SIGINT (Ctrl+C)
trap cleanup SIGTERM SIGINT
echo "PID: $$"
echo "Arquivo temp: $TMPFILE"
# Simular trabalho longo
while true; do
echo "$(date)" >> "$TMPFILE"
sleep 5
done
# Testar: em outro terminal
kill $(pgrep -f "meu_script.sh")
Sinal recebido. Limpando...
Dica: use
trap cleanup EXIT para executar a limpeza em qualquer saída do script — seja por sinal, erro ou término normal. É mais seguro do que capturar sinais individuais.