killall não mata todos e raramente mata, para que serve então?

12

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

Um exemplo recente foi com o thunderbird, onde havia cerca de 5 instâncias na memória, então decidi usar o comando killall . Ele matou dois processos e três ainda ficaram na memória. Tentei novamente e os 3 ainda estavam lá.

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

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

Eu sei que existem outros comandos como pkill , mas eu ficaria grato em entender por que o comando killall não funciona como esperado. Eu até tentei matar apenas um processo e é um sucesso e um fracasso. Mas o comando kill -9 funciona sempre.

Alguma idéia?

PS: sudo não faz diferença

    
por Meer Borg 21.03.2013 / 23:55

2 respostas

21

Da página man do killall

  

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

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

killall -s SIGKILL <PROCESSNAME>

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

De link

  

O envio de sinais para processos usando kill em um sistema Unix não é um novo   tópico para a maioria dos administradores de sistemas, mas muitas vezes me perguntaram   sobre a diferença entre matar e matar -9.

     

Sempre que você usar kill em um processo, estará realmente enviando o processo   um sinal (em quase todas as situações - eu vou entrar nisso em breve).   Aplicativos C padrão possuem um arquivo de cabeçalho que contém as etapas   que o processo deve seguir se receber um sinal particular. Você   pode obter uma lista completa dos sinais disponíveis no seu sistema   verificando a página man para matar.

     

Considere um comando como este:

     

kill 2563

     

Isso enviaria um sinal chamado SIGTERM para o processo. Uma vez   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 sendo executado indefinidamente
  •   

O aplicativo pode determinar o que deseja fazer uma vez   SIGTERM é recebido. Enquanto a maioria dos aplicativos limpará suas   recursos e parar, alguns não podem. Uma aplicação pode ser configurada para   fazer algo completamente diferente quando um SIGTERM é recebido. Também se   o aplicativo está em um estado ruim, como esperar por E / S de disco,   pode não ser capaz de agir sobre o sinal que foi enviado.

     

A maioria dos administradores de sistema geralmente recorre ao mais abrupto   sinalizar quando um aplicativo não responder a um SIGTERM:

     

kill -9 2563

     

O -9 informa ao comando kill que você deseja enviar   sinal # 9, que é chamado SIGKILL. Com um nome assim, é   óbvio que este sinal carrega um pouco mais de peso.

     

Embora o SIGKILL esteja definido no mesmo arquivo de cabeçalho de sinal que o SIGTERM,   não pode ser ignorado pelo processo. Na verdade, o processo nem é   tomou conhecimento do sinal SIGKILL desde que o sinal vai direto para o   inicialização do kernel. Nesse ponto, o init interromperá o processo. O processo   nunca tem a oportunidade de pegar o sinal e agir sobre ele.

     

No entanto, o kernel pode não conseguir matar o processo com sucesso   em algumas situações. Se o processo estiver aguardando por E / S de rede ou disco,   o kernel não poderá pará-lo. Processos e processos zumbis   pego em um sono ininterrupto não pode ser interrompido pelo kernel,   ou. Uma reinicialização é necessária 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 porque você precisava matá-los em primeiro lugar), então eles não poderiam atuar no sinal SIGTERM.

    
por tgm4883 22.03.2013 / 00:04
2

killall aceita a maioria da mesma sintaxe de kill . Em particular, não há necessidade de escrever nada extravagante para fazer com que killall faça o equivalente a kill -9 . Isso funciona muito bem:

killall -9 thunderbird

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

    
por Eliah Kagan 22.03.2013 / 00:16