Quando não devo matar -9 um processo?

401

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:

  1. Quando e por que deve kill -9ser usado? Quando e porque não?
  2. O que deve ser tentado antes de fazer isso?
  3. Que tipo de depuração de um processo "travado" pode causar mais problemas?
Mikel
fonte
7
Uma boa resposta SO relacionada .
jw013

Respostas:

362

Geralmente, você deve usar kill(abreviação de kill -s TERM, ou na maioria dos sistemas kill -15) antes kill -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 ignorar SIGKILL, mas podem e frequentemente capturam SIGTERM.) 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, ltracee gdbgeralmente são boas idéias para analisar por que um processo travado está travado. ( truss -uno Solaris é particularmente útil; acho que ltracemuitas vezes apresenta argumentos para chamadas de biblioteca em um formato inutilizável.) O Solaris também possui /procferramentas úteis , algumas das quais foram portadas para o Linux. ( pstackgeralmente é útil).

geekosaur
fonte
67
o motivo convincente é que, se você tem o hábito de enviar o SIGKILL, quando adquire um programa que, por exemplo, corrompe um banco de dados importante para você ou sua empresa, você realmente se arrependerá. kill -9tem 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.
Arcege
9
@ Mikel Outra coisa a fazer, às vezes é melhor enganar um aplicativo para que ele se limpe com um sinal como SIGQUIT ou SIGSEGV, se ele não responder ao SIGINT / SIGTERM. Por exemplo, um aplicativo 3D em tela cheia ou até mesmo um Xorg. Usando o SIGQUIT, ele não terá a chance de limpar nada, mas fará com que pense que uma falha de segmento acontece e sentirá que não tem escolha a não ser limpar e sair.
Penguin359
12
@Arcege Você acha que o uso de um banco de dados que corrompe os dados se for morto com -9 vale, afinal, um banco de dados? iirc, mysql, bdb, pg, etc ... todos se comportam bem quando mortos com -9.
precisa saber é o seguinte
13
killall -9 java ftw
dmourati
23
@dhruvbird: só porque seus DBs devem vir equipados com coletes à prova de balas não significa que você deve atirar neles se não precisar. Embora você possa estar certo de que não é tão arriscado quanto parece Arcege, acho que o argumento dele ainda é de que é arriscado e deve ser o último recurso.
Iconoclast
228

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).

(Citar abominação)

Não não não. Não use kill -9.

Não dá ao processo a chance de limpar:

1) desligue as conexões do soquete

2) limpar arquivos temporários

3) informar seus filhos que está indo embora

4) redefinir suas características terminais

e assim por diante e assim por diante.

Em geral, envie 15 e aguarde um ou dois segundos e, se isso não funcionar, envie 2 e, se não funcionar, envie 1. Se isso não funcionar, REMOVA O BINÁRIO, pois o programa está se comportando mal!

Não use kill -9. Não traga a colheitadeira apenas para arrumar o vaso de flores.

Apenas mais um uso inútil da Usenet,

(.assinatura)

Shawn J. Goff
fonte
12
O sistema operacional não fechará nenhum descritor de arquivo aberto (incluindo soquetes) quando o processo terminar?
Brian Gordon
3
Sim vai. Mas suponha que você esteja encerrando um processo do servidor com clientes conectados; os clientes não notarão que o servidor se esgotou antes do tempo limite.
Björn Lindqvist
45
Ah, sim, o velho argumento "se é imperfeito você é estúpido em usá-lo".
Timmmm 28/01
3
Ou estúpido para usar se se o processo em questão é a produção da sua empresa
Warren P
3
Se um processo for interrompido, o soquete enviará RST ao par, onde, como se o processo chamasse fechamento ou desligamento no soquete, o soquete envia FIN. Não há tempo limite necessário. Uma situação de tempo limite só ocorrerá se a energia cair ou o cabo de rede removido.
Ctrl-alt-delor 31/05/16
78

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.

dbrower
fonte
2
Como você testa a "morte aleatória -9"? Quando você mata -9, você termina e termina.
Karel Bílek
18
@Karel: Você testa se o seu sistema pode se recuperar posteriormente e limpa as transações confusas que estavam sendo processadas no momento da SIGKILL.
Tadeusz A. Kadłubowski 28/01
7
Não é bom fazer o kill -9mesmo 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 ou kill -9nã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.
Jlliagre
7
Suspeito o que Michael quis dizer com 'OK' é que seu programa deve lidar com essa situação normalmente e ser capaz de fazer alguma forma de limpeza na reinicialização. Por exemplo, limpar arquivos PID e assim por diante, em vez de apenas jogar seus brinquedos fora do carrinho e se recusar a começar.
gerryk
2
@gerryk Eles deveriam, de fato, mas o problema é que algumas pessoas tomarão essa resposta como uma "licença para matar -9", independentemente da situação e do ambiente. É uma atitude irresponsável.
Jlliagre
39

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.

borud
fonte
4
Concordo que um processo deve ser escrito para tolerar esse fracasso, mas acho que ainda é uma má prática fazer isso. Um banco de dados será recuperado, mas poderá detectar o cancelamento rude e, em seguida, acionar uma verificação de recuperação significativa quando reiniciado. E as solicitações que um processo está atendendo? Todos eles serão cortados instantaneamente, os clientes podem ter bugs e falhar também?
Daniel James Bryars
3
Um banco de dados que não pode ser morto a qualquer momento não é um banco de dados adequadamente confiável. Este é um requisito bastante básico se você precisar de consistência. Quanto aos clientes: se eles desviaram os dados e corromperam quando a conexão foi cortada, eles também foram mal projetados. A maneira de lidar com a perda de serviço é por meio de redundância e estratégias automáticas de failover / nova tentativa. Geralmente, para a maioria do sistema, a falha rápida é preferível à tentativa de recuperação.
borud 19/09/14
4
@borud Pode não ser um software perfeitamente escrito, mas é o que as pessoas usam o tempo todo. Quais administradores de sistema têm o luxo de sempre poder escolher um software perfeitamente escrito, até sempre se recuperar graciosamente de uma interrupção súbita? Nao muitos. Pessoalmente, uso scripts de desligamento e inicio / paro processos por isso. Se eles não responderem ao script de desligamento (que sinaliza adequadamente o processo), eu mato -9.
Steve Sether
2
Não há diferença entre cozinhar coisas básicas e pratos mais complexos em relação às ferramentas. A diferença é a cozinheira. (No entanto, se você gastar tanto tempo cozinhando quanto eu, percebe que a robustez é um requisito mínimo em utensílios de cozinha e que a maioria das pessoas que vende suprimentos de cozinha a consumidores não conheceria uma ferramenta ruim de uma ótima ferramenta.)
Borud 19/07
1
Então você incentiva as pessoas a serem desleixadas porque é difícil fazer as coisas corretamente? Cada vez mais softwares são executados em ambientes operacionais efêmeros. Se você escrever um software exigente, se não for desligado corretamente, será difícil convencer os empregadores a contratá-lo como desenvolvedor.
borud 18/05/19
10

Não mencionado em todas as outras respostas é um caso em kill -9que 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 -9um <defunct>processo ps -efpara ver qual é o pai dele e tentar o -15(TERM) ou -2(INT) e, por último, -9(KILL) no pai.

Nota: o que ps -effaz .

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 -9faz um processo, use-o apenas como último recurso , e se você precisar executar kill, use os sinais especificados acima antes de usar-9 (KILL)

Eduard Florinescu
fonte
6

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:

ps -ef|remove all processes not matching a certain criteria| awk '{print $2}'|ruby -e '$A=stdin.readlines; A.reverse.each{|a| puts "kill -9 #{a}"}'|bash

Lembre-se de que killnã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.

HandyGandy
fonte
1
O voto negativo foi outra pessoa. Mas quais recursos não são liberados? Você quer dizer que o processo não pode executar sua limpeza normal? E quanto a bloqueios de arquivos, semáforos etc.? Você pode elaborar?
Mikel
Parece que a memória compartilhada e os semáforos do SysV terão que ser limpos, pelo menos. arquivo.postgresql.org/pgsql-general/2006-10/msg01065.php
Mikel
8
Esta resposta é parcialmente confusa e parcialmente errada. kill -9 1é apenas ignorado na maioria das unidades. Não há nenhuma necessidade de evitar kill -9para mount, mas nenhum ponto em que quer. Não sei o que você quer dizer com "inverter a ordem dos processos". kill -9interrompe (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 processo kill -9libera a maioria dos recursos, mas não todos .
Gilles
5

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 SIGKILLa um pid não é garantia de matá-lo. Se ele estiver preso em um syscall ou já estiver zumbido ( Zin ps), ele poderá continuar zumbido. Esse é geralmente o caso de um longo processo de execução e esquecimento bgantes de tentar kill -9. Um simples fgreconectará 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ós SIGKILLserem 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 killcom o PID negado, não apenas o PID em si . Não há nenhuma garantia de SIGHUP, SIGPIPEou SIGINTou 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 que kill -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)

dhchdhd
fonte
3

Por que você não deseja kill -9um processo normalmente

De acordo com man 7 signal:

Os sinais SIGKILL e SIGSTOP não podem ser capturados, bloqueados ou ignorados.

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 -9um processo

Você deve se certificar de que, antes de enviar o sinal para o processo, você:

  1. Certifique-se de que o processo não esteja ocupado (ou seja, fazendo "trabalho"); enviar um kill -9para o processo resultará essencialmente na perda desses dados.
  2. Se o processo for um banco de dados não responsivo, verifique se ele limpou seus caches primeiro. Alguns bancos de dados suportam o envio de outros sinais ao processo para forçar a liberação de seu cache.

fonte
3

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 SIGTERMe SIGKILL, ou mesmo SIGTERM, SIGINTe SIGKILL. 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

Dr Beco
fonte