Uma boa explicação da diferença entre SIGKILL e SIGTERM (e por que você deve tentar o SIGTERM primeiro)
Enviar sinais para processos usando kill em um sistema Unix não é um tópico novo para a maioria dos administradores de sistemas, mas muitas vezes me perguntam sobre a diferença entre kill e kill -9.
Sempre que você usa kill em um processo, na verdade está enviando um sinal ao processo (em quase todas as situações - entrarei nisso em breve). Os aplicativos C padrão têm um arquivo de cabeçalho que contém as etapas que o processo deve seguir se receber um sinal específico. Você pode obter uma lista completa dos sinais disponíveis em seu sistema, verificando a página de manual quanto a kill.
Considere um comando como este:
kill 2563
Isso enviaria um sinal chamado SIGTERM para o processo. Depois que o processo recebe o aviso, algumas coisas diferentes podem acontecer:
- o processo pode parar imediatamente
- o processo pode parar após um pequeno atraso após a limpeza dos recursos
- o processo pode continuar em execução indefinidamente
O aplicativo pode determinar o que deseja fazer quando um SIGTERM for recebido. Embora a maioria dos aplicativos limpe seus recursos e pare, outros podem não. Um aplicativo pode ser configurado para fazer algo completamente diferente quando um SIGTERM é recebido. Além disso, se o aplicativo estiver em um estado ruim, como aguardando a E / S do disco, talvez não seja possível atuar no sinal enviado.
A maioria dos administradores de sistema geralmente recorre ao sinal mais abrupto quando um aplicativo não responde a um SIGTERM:
kill -9 2563
O -9 informa ao comando kill que você deseja enviar o sinal # 9, chamado SIGKILL. Com um nome como esse, é óbvio que esse sinal carrega um pouco mais de peso.
Embora SIGKILL esteja definido no mesmo arquivo de cabeçalho de sinal que o SIGTERM, ele não pode ser ignorado pelo processo. De fato, o processo nem sequer está ciente do sinal SIGKILL, já que o sinal vai direto para o init do kernel. Nesse ponto, o init interromperá o processo. O processo nunca tem a oportunidade de captar o sinal e agir sobre ele.
No entanto, o kernel pode não ser capaz de eliminar com êxito o processo em algumas situações. Se o processo estiver aguardando E / S de rede ou disco, o kernel não poderá interrompê-lo. Os processos zumbis e os processos presos em um sono ininterrupto também não podem ser interrompidos pelo kernel. É necessária uma reinicialização para limpar esses processos do sistema.
Quando você enviou killall (SIGTERM) para os processos do thunderbird, solicitou que esses processos parassem. Alguns desses processos não estavam funcionando corretamente (provavelmente por que você precisou matá-los), para que eles não pudessem agir no sinal do SIGTERM.
killall
aceita a maioria da mesma sintaxe quekill
. Em particular, não há necessidade de escrever nada sofisticado parakillall
fazer o equivalente akill -9
. Isso funciona muito bem:(Obviamente, como discutido, você geralmente deve relutar em usar
killall -9
ou, equivalentementekillall -KILL
, a menos que outras medidas já tenham sido tentadas sem sucesso.)fonte