Qual é o propósito da opção -9 no comando kill?

41

Existe uma diferença entre

kill -9 212121

e

kill 212121
    
por user784637 04.09.2012 / 20:05

4 respostas

23

A página de manual do Ubuntu para kill explica o propósito da mudança de -9 (reconhecidamente de uma forma bastante instável):

Name     Num   Action    Description
KILL       9   exit      cannot be blocked

Veja o que outra página de manual diz.

  

O comando kill envia o sinal especificado para o processo ou grupo de processos especificado. Se nenhum sinal for especificado, o sinal TERM será enviado. O sinal TERM irá matar processos que não captem este sinal. Para outros processos, pode ser necessário usar o sinal KILL ( 9 ), pois este sinal não pode ser capturado.

Portanto, usar a opção -9 garante que o processo seja efetivamente eliminado. Mesmo que um processo congelado ou sem resposta não responda a um simples sinal TERM , ele morrerá quando for enviado um sinal KILL .

    
por SirCharlo 04.09.2012 / 20:12
37

O comando kill enviará um < href="http://en.wikipedia.org/wiki/Signal_%28computing%29"> sinal para um processo com uma determinada identidade (PID):

kill -<signal> <pid>

É claro que só podemos matar os processos que possuímos, enquanto o root pode matar todos os processos. Veja Wikipedia para um bom resumo dos sinais de computação.

Os sinais kill podem enviar estão listados na página de manual . O sinal pode ser representado por nome ou por número. Se nenhum sinal é dado o sinal padrão 15 resp. TERM é usado.

Todos os três comandos abaixo são, portanto, idênticos:

kill -9 1234
kill -KILL 1234
kill -SIGKILL 1234

A diferença entre SIGTERM e SIGKILL é a maneira como um aplicativo pode atuar no sinal:

  • TERM : um aplicativo poderá finalizar, ou seja, executar corretamente uma rotina de desligamento.
  • KILL : os aplicativos são interrompidos e mortos imediatamente (o que pode levar à perda de dados ou ao aumento de um relatório para relatar uma falha presumida em alguns casos).
por Takkat 04.09.2012 / 20:32
12

Observe que todos os itens a seguir são sinônimos:

kill -9 1234
kill -KILL 1234
kill -SIGKILL 1234

Vale a pena ressaltar que, no mundo da manipulação de sinais, o SIGKILL é um dos poucos únicos que são tratados pelo sistema operacional e não pelo programa. Quando você executa kill -9 , não está dizendo ao aplicativo para finalizar a si mesmo, em vez disso, está dizendo ao SO para parar de executar o programa, não importa o que o programa esteja fazendo.

Após o envio de SIGKILL , o programa será imediatamente interrompido. Se houver chamadas do kernel em execução (por exemplo, IO do Arquivo) em nome do programa, essas chamadas poderão ou não continuar até que sejam concluídas, dependendo da chamada, mas o programa em si não será mais executado. Observe que as tarefas rastreadas ou tarefas em execução em um depurador podem se comportar de maneira diferente aqui.

O outro sinal que não pode ser bloqueado é SIGSTOP que tem um efeito similar, mas congela o programa; você pode enviar SIGCONT mais tarde para continuar. Esse comportamento é completamente controlado pelo sistema operacional e o programa não recebe nenhuma notificação prévia.

Todos os outros sinais são enviados para o programa; ele pode manipulá-los da maneira que escolher, ou se ignorar o sinal, então um comportamento padrão é seguido.

Aqui estão alguns sinais úteis que você pode estar enviando para um processo:

  • SIGHUP - hangup
    Informa ao programa que o usuário desconectou (por exemplo, a sessão SSH ou a janela do terminal foi fechada). Geralmente faz um desligamento gracioso do programa.
  • SIGINT - interromper
    Enviado quando você clica em CTRL + C
    Normalmente significa "pare o que você está fazendo" - pode ou não matar o programa
  • SIGTERM - terminar
    O padrão enviado por kill e killall .
    Geralmente termina o programa ... às vezes depois que o programa termina o que está fazendo.
  • SIGSTOP - parar
    Enviado quando você clica em CTRL + Z
    Pausa o programa, discutido acima
  • SIGPIPE - tubo fechado
    Diz ao programa que o pipeline foi fechado. Geralmente termina o programa.
    Por exemplo, cat /etc/passwd | head -n1 enviará SIGPIPE ao processo cat depois que a primeira linha for impressa, fazendo com que cat termine antes de terminar o arquivo inteiro.

Enquanto todos esses sinais acontecem "naturalmente" em sua própria configuração, você pode usar o sinal para falsificar uma condição para alcançar o resultado desejado.

Por exemplo, se você quiser encerrar a sessão SSH de alguém, você pode simplesmente matar o processo, mas ao fazer isso você impedirá que ele atualize seu arquivo HISTORY, o que pode ser importante por razões de segurança. Mas se você enviar SIGHUP , o processo assumirá que a conexão morreu e executará sua limpeza padrão.

    
por tylerl 05.09.2012 / 08:34
6

kill -9 Significado: O processo será eliminado pelo kernel; este sinal não pode ser ignorado. 9 significa sinal KILL que não é acessível ou ignorável

Usos: SIGKILL singal

Kill Significado: O comando kill sem qualquer sinal passa o sinal 15, que termina o processo da maneira normal.

Usos: sinal SIGTERM , que pode ser manipulado por programadores

    
por devav2 04.09.2012 / 20:21