killall não mata tudo e raramente mata, qual é o comando para então?

12

Ocasionalmente, uso o killallcomando para matar processos. A razão pela qual digo ocasionalmente é que, em alguns casos, não funcionou para mim.

Um exemplo recente foi com thunderbird, onde havia cerca de 5 instâncias na memória, então eu decidi usar o killallcomando. Ele matou 2 processos e 3 ainda estavam na memória. Tentei novamente e os 3 ainda estavam lá.

Então, eu usei manualmente o kill -9comando para eliminar cada um dos processos individuais por meio de seus pids. Isso funcionou.

Eu principalmente uso o kill -9comando como ele funciona. O killallcomando me decepcionou tantas vezes que simplesmente não me incomodo em usá-lo. Mas deve haver uma razão pela qual não funciona. Estou usando errado?

Eu sei que existem outros comandos, pkillmas ficaria grato em entender por que o killallcomando não funciona conforme o esperado. Eu até tentei matar apenas um processo e é um caso de sucesso. Mas o kill -9comando funciona sempre.

Alguma ideia?

PS: sudonão faz diferença

Meer Borg
fonte

Respostas:

22

Na página de manual do killall

killall envia um sinal para todos os processos executando qualquer um dos comandos especificados. Se nenhum nome de sinal for especificado, o SIGTERM será enviado.

Quando você faz um kill -9, você está enviando o sinal SIGKILL. Se você quiser enviar um SIGKILL com killall, precisará fazer

killall -s SIGKILL <PROCESSNAME>

Uma boa explicação da diferença entre SIGKILL e SIGTERM (e por que você deve tentar o SIGTERM primeiro)

From http://rackerhacker.com/2010/03/18/sigterm-vs-sigkill/

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.

tgm4883
fonte
Alguma especulação sobre por que ele matou apenas algumas das instâncias de thunderbird?
Meer Borg
@Doogfar Ver o meu writeup editada (ou a página que eu ligado)
tgm4883
Obrigado, também explica por que meu Thunderbird foi corrompido, kill -9 foi muito duro
Meer Borg
Ainda nem sempre funciona.
Craig Hicks
4

killallaceita a maioria da mesma sintaxe que kill. Em particular, não há necessidade de escrever nada sofisticado para killallfazer o equivalente a kill -9. Isso funciona muito bem:

killall -9 thunderbird

(Obviamente, como discutido, você geralmente deve relutar em usar killall -9ou, equivalentemente killall -KILL, a menos que outras medidas já tenham sido tentadas sem sucesso.)

Eliah Kagan
fonte
Ainda assim, nem sempre funciona, então deve haver algo mais.
Craig Hicks