![killall não mata todos e raramente mata, qual é o comando então?](https://rvso.com/image/833372/killall%20n%C3%A3o%20mata%20todos%20e%20raramente%20mata%2C%20qual%20%C3%A9%20o%20comando%20ent%C3%A3o%3F.png)
Ocasionalmente, uso o killall
comando para encerrar processos. A razão pela qual digo ocasionalmente é 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 killall
comando. Ele matou 2 processos e 3 ainda permaneceram na memória. Tentei novamente e os 3 ainda estavam lá.
Então usei manualmente o kill -9
comando para eliminar cada um dos processos individuais por meio de seus pids. Isso funcionou.
Eu uso principalmente o kill -9
comando enquanto ele funciona. O killall
comando me decepcionou tantas vezes que simplesmente não me preocupo 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 ficaria grato em entender por que o killall
comando não funciona conforme o esperado. Eu até tentei matar apenas um processo e é um caso de acerto e erro. Mas o kill -9
comando funciona sempre.
Alguma ideia?
PS: sudo
não faz diferença
Responder1
Na página de manual do killall
killall envia um sinal para todos os processos que executam qualquer um dos comandos especificados. 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 sobre a diferença entre SIGKILL e SIGTERM (e por que você deve tentar o SIGTERM primeiro)
Dehttp://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 já me perguntaram muitas vezes sobre a diferença entre kill e kill -9.
Sempre que você usa kill em um processo, na verdade você está enviando um sinal ao processo (em quase todas as situações – falarei disso em breve). Aplicações C padrão possuem um arquivo de cabeçalho que contém as etapas que o processo deve seguir caso receba um determinado sinal. Você pode obter uma lista completa dos sinais disponíveis em seu sistema verificando a página de manual para matar.
Considere um comando como este:
kill 2563
Isso enviaria um sinal chamado SIGTERM ao processo. Assim que o processo receber a notificação, 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
A aplicação pode determinar o que deseja fazer assim que um SIGTERM for recebido. Embora a maioria dos aplicativos limpe seus recursos e pare, alguns não. Uma aplicação pode ser configurada para fazer algo completamente diferente quando um SIGTERM é recebido. Além disso, se o aplicativo estiver em mau estado, como aguardando E/S de disco, ele poderá não conseguir agir de acordo com o 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 nº 9, que é chamado SIGKILL. Com um nome como esse, é óbvio que esse sinal tem um pouco mais de peso.
Embora SIGKILL seja definido no mesmo arquivo de cabeçalho de sinal que SIGTERM, ele não pode ser ignorado pelo processo. Na verdade, o processo nem sequer toma conhecimento do sinal SIGKILL, pois 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 de acordo com ele.
No entanto, o kernel pode não conseguir encerrar o processo com êxito em algumas situações. Se o processo estiver aguardando E/S de rede ou disco, o kernel não será capaz de pará-lo. Processos zumbis e processos capturados em um sono ininterrupto também não podem ser interrompidos pelo kernel. Uma reinicialização é necessária para limpar esses processos do sistema.
Quando você enviou killall (SIGTERM) para os processos do Thunderbird, você solicitou que esses processos parassem. Alguns desses processos não estavam funcionando corretamente (provavelmente por que você precisou eliminá-los em primeiro lugar), então eles não puderam agir no sinal SIGTERM.
Responder2
killall
aceita quase a mesma sintaxe de kill
. Em particular, não há necessidade de escrever nada sofisticado para fazer killall
o equivalente a kill -9
. Isso funciona muito bem:
killall -9 thunderbird
(É claro que, conforme discutido, você geralmente deve relutar em usar killall -9
ou, equivalentemente, killall -KILL
, a menos que outras medidas já tenham sido tentadas sem sucesso.)
Responder3
Para quem procura uma resposta rápida:
sudo killall -s SIGTERM processname