Qual é o objetivo da opção -9 no comando kill?

Respostas:

28

A página de manual do Ubuntu killexplica o propósito do -9switch (reconhecidamente de uma maneira um tanto instável):

Name     Num   Action    Description
KILL       9   exit      cannot be blocked

Aqui está o que outra página de manual diz.

O comando killenvia o sinal especificado para o processo ou grupo de processos especificado. Se nenhum sinal for especificado, o TERMsinal será enviado. O TERMsinal matará processos que não captam esse sinal. Para outros processos, pode ser necessário usar o sinal KILL( 9), pois esse sinal não pode ser capturado.


Portanto, o uso do -9comutador garante que o processo seja efetivamente eliminado. Mesmo que um processo congelado ou sem resposta possa não responder a um TERM sinal simples , ele morrerá quando for enviado um KILLsinal.

SirCharlo
fonte
40

O comando kill enviará um sinal definido para um processo com uma determinada identidade (PID):

kill -<signal> <pid>

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

Os sinais que killpodem ser enviados estão listados na página de manual . O sinal pode ser representado por nome ou número. Se nenhum sinal for 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 SIGTERMe SIGKILLé a maneira como um aplicativo pode atuar no sinal:

  • TERM: um aplicativo poderá terminar, ou seja, executar corretamente uma rotina de desligamento.
  • KILL: os aplicativos são interrompidos e eliminados imediatamente (o que pode levar à perda de dados ou ao aumento da comunicação para relatar uma falha presumida em alguns casos).
Takkat
fonte
16

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

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

Vale ressaltar que, no mundo do tratamento de sinais, o SIGKILL é um dos poucos únicos tratados pelo sistema operacional e não pelo programa. Ao executar kill -9, você não está dizendo para o aplicativo se encerrar, mas para o sistema operacional para parar de executar o programa, não importa o que o programa esteja fazendo.

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

O outro sinal que não pode ser bloqueado é o SIGSTOP, que tem um efeito semelhante, mas congela o programa; você pode enviar o SIGCONT posteriormente 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 lidar com eles da maneira que escolher ou, se ignorar o sinal, será seguido um comportamento padrão.

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

  • SIGHUP - hangup
    Diz ao programa que o usuário desconectou (por exemplo, a sessão SSH ou a janela do terminal foi fechada).
    Geralmente faz um desligamento normal do programa.
  • SIGINT - interrupção
    Enviado quando você pressiona CTRL+ C
    Normalmente significa "pare o que está fazendo" - pode ou não matar o programa
  • SIGTERM - finalizar
    O padrão enviado por kille killall.
    Normalmente termina o programa ... às vezes depois que o programa termina o que está fazendo.
  • SIGSTOP - parar
    Enviado quando você pressiona CTRL+ Z
    Pausa o programa, discutido acima
  • SIGPIPE - tubulação fechada
    Informa ao programa que a tubulação foi fechada. Normalmente termina o programa.
    Por exemplo cat /etc/passwd | head -n1, enviará o SIGPIPE para o catprocesso após a primeira linha ser impressa, causando cata finalização antes de terminar o arquivo inteiro.

Embora todos esses sinais aconteçam "naturalmente" em sua própria configuração, você pode usá-lo para falsificar uma condição para alcançar o resultado desejado.

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

tylerl
fonte
Ctrl + \ envia SIGQUIT, onde a ação padrão é despejar o núcleo e finalizar. Isso pode ser usado se um programa está fazendo algo muito errado, você precisa interrompê-lo imediatamente e gostaria de poder depurá-lo mais tarde.
Simon Richter
@SimonRichter Oh, você está certo. fixo.
tylerl
6

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

Usos: SIGKILL singal

Kill Significado: O comando kill sem nenhum sinal passa pelo sinal 15, que finaliza o processo da maneira normal.

Usos: sinal SIGTERM , que pode ser manipulado por programadores

devav2
fonte