Sempre hesito em executar kill -9
, mas vejo outros administradores fazendo isso quase rotineiramente.
Eu acho que provavelmente existe um meio termo sensato, então:
- Quando e por que deve
kill -9
ser usado? Quando e porque não? - O que deve ser tentado antes de fazer isso?
- Que tipo de depuração de um processo "travado" pode causar mais problemas?
Respostas:
Geralmente, você deve usar
kill
(abreviação dekill -s TERM
, ou na maioria dos sistemaskill -15
) anteskill -9
(kill -s KILL
) para dar ao processo de destino a chance de limpar depois de si mesmo. (Os processos não podem capturar ou ignorarSIGKILL
, mas podem e frequentemente capturamSIGTERM
.) Se você não der ao processo a chance de concluir o que está fazendo e limpar, poderá deixar arquivos corrompidos (ou outro estado) ao redor dele. não será capaz de entender uma vez reiniciado.strace
/truss
,ltrace
egdb
geralmente são boas idéias para analisar por que um processo travado está travado. (truss -u
no Solaris é particularmente útil; acho queltrace
muitas vezes apresenta argumentos para chamadas de biblioteca em um formato inutilizável.) O Solaris também possui/proc
ferramentas úteis , algumas das quais foram portadas para o Linux. (pstack
geralmente é útil).fonte
kill -9
tem seu uso, como terminador de último recurso, ênfase no último recurso; administradores que o utilizam antes do último recurso a) não entendem ser um administrador muito bem eb) não devem estar em um sistema de produção.Randal Schwartz costumava postar "Uso inútil de (x)" nas listas. Um desses posts era sobre
kill -9
. Inclui razões e uma receita a seguir. Aqui está uma versão reconstruída (citada abaixo).fonte
Deve ser sempre bom fazer o mesmo
kill -9
, assim como sempre deve ser bom desligar, puxando o cabo de alimentação. Pode ser anti-social e deixar um pouco de recuperação, mas deve funcionar e é uma ferramenta poderosa para os impacientes.Eu digo isso como alguém que tentará matar simples (15) primeiro, porque isso dá ao programa a chance de fazer uma limpeza - talvez apenas escrevendo em um log "saindo no sig 15". Mas não aceitarei nenhuma queixa sobre mau comportamento em uma morte -9.
O motivo: muitos clientes fazem isso com coisas que os programadores preferem e não fazem. O teste aleatório kill -9 é um cenário de teste bom e justo e, se o seu sistema não lidar com isso, seu sistema está danificado.
fonte
kill -9
mesmo que não é bom para desligar o plugue. Embora haja situações em que você não tem escolha, essa deve ser uma ação de último recurso. Obviamente, puxar o cabo de alimentação oukill -9
não deve ter efeitos adversos, como impedir que o aplicativo ou o sistema operacional seja reiniciado corretamente, mas as coisas acontecem e o uso das formas recomendadas (kill [-15]
) ou o desligamento regular ajudarão a evitar a bagunça que pode ocorrer se você interrompe rotineiramente programas e sistemas operacionais dessa maneira. Em qualquer caso, sempre existe o risco de perder dados, independentemente da robustez do código.Uso kill -9 da mesma maneira que jogo utensílios de cozinha na máquina de lavar louça: se um utensílio de cozinha é arruinado pela máquina de lavar louça, não o quero.
O mesmo vale para a maioria dos programas (até os bancos de dados): se eu não posso matá-los sem que as coisas dêem errado, eu realmente não quero usá-los. (E se você usar um desses não bancos de dados que o incentive a fingir que eles mantiveram dados quando não existem: bem, acho que é hora de você começar a pensar no que está fazendo).
Porque no mundo real as coisas podem cair a qualquer momento por qualquer motivo.
As pessoas devem escrever um software tolerante a falhas. Em particular em servidores. Você deve aprender como projetar software que pressupõe que as coisas vão quebrar, travar etc.
O mesmo vale para o software de desktop. Quando eu quero desligar meu navegador, normalmente leva o AGES para desligar. Não há nada que meu navegador precise fazer que demore mais do que alguns segundos. Quando eu peço para desligar, ele deve fazer isso imediatamente. Quando isso não acontece, então retiramos kill -9 e o fazemos.
fonte
Não mencionado em todas as outras respostas é um caso em
kill -9
que não funciona, quando um processo é<defunct>
e não pode ser eliminado:Como posso matar um processo <defunct> cujo pai é init?
O que é extinto para um processo e por que ele não é morto?
Portanto, antes de você tentar executar
kill -9
um<defunct>
processops -ef
para ver qual é o pai dele e tentar o-15
(TERM) ou-2
(INT) e, por último,-9
(KILL) no pai.Nota: o que
ps -ef
faz .Edição e cuidado posteriores: Prossiga com cuidado ao matar processos, seus pais ou filhos, pois eles podem deixar arquivos abertos ou corrompidos, conexões inacabadas, bancos de dados corrompidos etc., a menos que você saiba o que
kill -9
faz um processo, use-o apenas como último recurso , e se você precisar executar kill, use os sinais especificados acima antes de usar-9 (KILL)
fonte
Nunca, nunca faça um
kill -9 1
. Evite também matar em certos processos como mount`. Quando eu tenho que matar muitos processos (digamos, por exemplo, uma sessão do X fica travada e preciso matar todos os processos de um determinado usuário), inverto a ordem dos processos. Por exemplo:Lembre-se de que
kill
não interrompe um processo e libera seus recursos. Tudo o que faz é enviar um sinal da SIGKILL para o processo; você pode terminar com um processo interrompido.fonte
kill -9 1
é apenas ignorado na maioria das unidades. Não há nenhuma necessidade de evitarkill -9
paramount
, mas nenhum ponto em que quer. Não sei o que você quer dizer com "inverter a ordem dos processos".kill -9
interrompe (como em, mata) um processo, sem dar a chance de reclamar, no entanto, a matança não ocorrerá imediatamente se o processo estiver em uma chamada de sistema ininterrupta . Matar um processokill -9
libera a maioria dos recursos, mas não todos .Matar processos à vontade não é uma ação fácil: os dados podem ser perdidos, os aplicativos mal projetados podem se quebrar de maneiras sutis que não podem ser corrigidas sem a reinstalação .. mas isso depende completamente de saber o que é e o que não é seguro em um dada situação. e o que estaria em risco. O usuário deve ter uma idéia do que um processo está ou deve estar fazendo e quais são as restrições (IOPS de disco, rss / swap) e ser capaz de estimar quanto tempo um processo demorado deve levar (por exemplo, uma cópia de arquivo, reencodificação de mp3, migração de e-mail, backup, [seu horário favorito aqui].)
Além disso, enviar
SIGKILL
a um pid não é garantia de matá-lo. Se ele estiver preso em um syscall ou já estiver zumbido (Z
inps
), ele poderá continuar zumbido. Esse é geralmente o caso de um longo processo de execução e esquecimentobg
antes de tentarkill -9
. Um simplesfg
reconectará stdin / stdout e provavelmente desbloqueará o processo, geralmente seguido pelo término do processo. Se ele estiver travado em outro lugar ou em alguma outra forma de conflito do kernel, apenas uma reinicialização poderá remover o processo. (Os processos zumbis já estão mortos apósSIGKILL
serem processados pelo kernel (nenhum código adicional da terra do usuário será executado), geralmente há uma razão do kernel (semelhante a estar "bloqueado" esperando a conclusão de um syscall) pelo processo não terminar.)Além disso, se você deseja matar um processo e todos os seus filhos, adquira o hábito de ligar
kill
com o PID negado, não apenas o PID em si . Não há nenhuma garantia deSIGHUP
,SIGPIPE
ouSIGINT
ou outros sinais limpeza após isso, e ter um monte de processos renegados para limpeza (lembre-se vira-lata?) É irritante.Bônus maligno:
kill -9 -1
é um pouco mais prejudicial do quekill -9 1
(não faça isso como root, a menos que queira ver o que acontece em uma VM descartável e não importante)fonte
Por que você não deseja
kill -9
um processo normalmenteDe acordo com
man 7 signal
:Isso significa que o aplicativo que recebe um desses sinais não pode "capturá-los" para executar qualquer comportamento de desligamento.
O que você deve fazer antes de executar
kill -9
um processoVocê deve se certificar de que, antes de enviar o sinal para o processo, você:
kill -9
para o processo resultará essencialmente na perda desses dados.fonte
Eu criei um script que ajuda a automatizar esse problema.
É baseado na minha resposta completa 2 em uma pergunta muito semelhante ao stackoverflow .
Você pode ler todas as explicações lá. Para resumir, eu recomendaria just
SIGTERM
eSIGKILL
, ou mesmoSIGTERM
,SIGINT
eSIGKILL
. No entanto, dou mais opções na resposta completa.Por favor, sinta-se livre para fazer o download (clonar) do repositório do github para matar 1
fonte