Comando kill: parar processos e serviços no Linux

Terminal Linux a enviar sinais com kill e a gerir serviços com systemctl numa resposta a incidentes

Mais cedo ou mais tarde, quem administra sistemas Linux tem de fazer uma pergunta desconfortável: como paro isto? Um processo que enlouqueceu e come 100% de CPU, um serviço que reinicia em ciclo, ou — no pior dos casos — um binário estranho que não devia estar a correr. A resposta instintiva costuma ser um kill -9 rápido. E é quase sempre a resposta errada.

Neste artigo separamos duas ferramentas que trabalham em camadas diferentes: o kill, que envia sinais a processos, e o systemctl, que gere serviços através do systemd. Perceber quando usar cada um — e por que ordem — é a diferença entre resolver um problema e piorá-lo, sobretudo durante uma resposta a incidentes.

O que faz o kill

Apesar do nome, o kill não «mata» nada diretamente: envia um sinal a um processo, identificado pelo seu PID. É depois o processo (ou o núcleo) que decide o que fazer com esse sinal. Há dezenas de sinais; na prática do dia a dia interessam meia dúzia.

kill [-SINAL] PID
kill -l          # lista todos os sinais disponíveis

O sinal por omissão é o SIGTERM (15): um pedido educado de término. O processo recebe-o, pode fechar ficheiros, gravar o estado e sair de forma ordenada. A alternativa violenta é o SIGKILL (9), que não passa pelo processo — é o núcleo que o remove de imediato, sem hipótese de limpeza. Por isso a regra é simples: tente sempre o 15 antes do 9.

Os sinais que interessam

SIGTERM, SIGKILL e SIGHUP

  • kill PID ou kill -15 PID — envia SIGTERM. É o ponto de partida para terminar qualquer processo de forma limpa.
  • kill -9 PID — envia SIGKILL. Incapturável e imediato, mas sem limpeza: pode deixar ficheiros a meio, sockets pendurados ou dados por gravar. Último recurso.
  • kill -HUP PID — envia SIGHUP. Historicamente significava «a linha caiu», mas muitos serviços reinterpretam-no como «relê a configuração». Um kill -HUP no processo principal do servidor web, por exemplo, aplica configuração nova sem derrubar o serviço.
  • kill -0 PID — não envia sinal nenhum; serve apenas para testar se o processo existe e pode ser sinalizado. Muito usado em scripts.

Sinalizar por nome: killall e pkill

Nem sempre sabemos o PID. Duas ferramentas sinalizam processos por outros critérios:

  • killall NOME — envia um sinal (SIGTERM por omissão) a todos os processos com um dado nome. Útil, mas cego: apanha tudo o que se chame assim.
  • pkill e pgrep — selecionam por padrão, por utilizador (-u), por sessão e mais. pkill -u www-data termina todos os processos desse utilizador — poderoso e perigoso na mesma medida.
# Terminar um processo pelo PID, de forma limpa
kill 2087

# Recarregar a configuração sem reiniciar
kill -HUP 1204

# Só em último recurso, quando o processo ignora o SIGTERM
kill -9 2087

Onde o kill falha: os serviços do systemd

Aqui está a armadilha que apanha muita gente. Num sistema moderno com systemd, os serviços têm normalmente uma diretiva Restart=. Se um serviço estiver configurado com Restart=always e nós matarmos o seu processo — com 15 ou com 9, tanto faz — o systemd deteta a saída e volta a lançá-lo de imediato, com um novo PID. Matar o processo não trava o serviço. Para isso, temos de subir uma camada.

Gerir serviços com systemctl

O systemctl é a interface de controlo do systemd. Em vez de mexer em processos soltos, atua sobre units — normalmente serviços (.service). A forma geral é intuitiva:

systemctl COMANDO UNIT
  • systemctl status UNIT — mostra o estado (active, inactive, failed), o Main PID, o ExecStart e as últimas linhas de log. É por aqui que se começa sempre: entender antes de agir.
  • systemctl start / stop UNIT — arranca ou pára o serviço agora. Um stop deliberado anula a lógica de Restart: o systemd não o volta a levantar.
  • systemctl restart / reload UNIT — reinicia por completo, ou relê a configuração sem reiniciar (quando o serviço o suporta).
  • systemctl enable / disable UNIT — liga ou desliga o arranque automático no boot. Não afeta o estado atual, só o próximo arranque.
  • systemctl enable --now / disable --now — combinam as duas ações: enable --now ativa e arranca; disable --now desativa e pára, num só passo.
  • systemctl list-units --failed — lista as units em estado failed. Excelente para uma triagem rápida do que está partido.
  • systemctl daemon-reload — obriga o systemd a reler os ficheiros de unit depois de os editarmos. Sem isto, o systemd continua a usar a definição antiga em memória.

A distinção entre parar e desativar é essencial: stop pára o serviço agora, mas ao próximo arranque ele volta se estiver enabled. Para o remover de vez, é preciso disable — de preferência com --now, para as duas coisas de uma vez.

kill e systemctl em cibersegurança

Conter sem destruir evidência. Numa resposta a incidentes, o reflexo de disparar kill -9 contra um processo suspeito é contraproducente. O SIGKILL apaga o estado do processo — memória, ficheiros abertos, ligações — que poderia ser recolhido para análise forense. A abordagem correta é documentar primeiro (que processo é, que ficheiro executa, que sockets tem abertos) e só depois conter, preferindo o stop controlado ao sinal violento.

Serviços como mecanismo de persistência. Uma técnica clássica de persistência é registar um serviço systemd que relança o malware sempre que este morre ou a máquina reinicia. É por isso que matar o processo não chega: com Restart=always, ele renasce. A contenção real faz-se pela ordem systemctl status (perceber o que é e de onde arranca) → stop (parar) → disable (impedir que volte). Um ExecStart a apontar para /tmp ou para um caminho oculto é um forte indicador de comprometimento.

Sinais como comunicação entre processos. Os sinais não servem só para terminar: são um mecanismo de IPC. O SIGHUP para recarregar configuração, o SIGUSR1/SIGUSR2 para acionar comportamentos definidos pela aplicação (rodar logs, ativar depuração). Saber isto evita reinícios desnecessários de serviços em produção.

Experimente no simulador interativo

A simulação abaixo recria uma máquina comprometida: um processo /tmp/.x/kworkerd a devorar a CPU, mantido vivo por um serviço sysupdate com Restart=always. No painel esquerdo vê os processos e os serviços com o respetivo estado; no terminal à direita, o efeito de cada comando. Clique nas ações — kill, kill -9, kill -HUP, systemctl status/stop/disable — e repare como o estado da máquina muda. Use Demonstrar tudo para seguir a sequência guiada de resposta ao incidente, ou navegue passo a passo com Anterior e Seguinte. O botão Repor estado devolve a máquina à situação inicial.

Erros comuns e boas práticas

  • Começar pelo kill -9: retira ao processo qualquer hipótese de limpeza e destrói estado útil para análise. Tente sempre o SIGTERM primeiro.
  • Matar o processo de um serviço gerido pelo systemd: com Restart=always ele volta com novo PID. Use systemctl stop, não kill.
  • Confundir stop com disable: parar não impede o arranque no próximo boot. Para conter de vez, combine com disable (ou use disable --now).
  • Abusar do pkill -u: termina todos os processos de um utilizador, incluindo serviços legítimos. É um martelo, não um bisturi.
  • Esquecer o daemon-reload: depois de editar um ficheiro de unit, o systemd continua a usar a versão antiga até ser avisado.
  • Trabalhar por PID em ambientes dinâmicos: os PID mudam a cada arranque do processo. Sempre que possível, atue ao nível do serviço, que é estável.

Conclusão

O kill e o systemctl resolvem o mesmo objetivo aparente — «parar isto» — mas em camadas diferentes, e trocá-las é fonte de erros. A regra que fica: sinais para processos avulsos e recargas de configuração; systemctl para tudo o que seja um serviço. E, perante o suspeito, a ordem certa é sempre perceber, parar e impedir que volte. Se administra utilizadores para além de processos, veja também o nosso artigo sobre o useradd.

Quer levar estas competências mais longe, ou precisa de apoio especializado em resposta a incidentes e administração de sistemas? Conheça os serviços de formação e consultoria da HJFR no nosso catálogo de serviços — desenhamos percursos práticos para equipas técnicas e programas à medida para empresas.

Este artigo faz parte da série «Comandos Linux, um a um» do blog HJFR — fique atento aos próximos comandos.