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:

# 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.