Quando você tenta encerrar um processo para sempre, qual opção para "matar" você deve usar?


26

Estou recebendo muitas mensagens contraditórias das pessoas e queria saber se realmente não há muita diferença no que você usa.

kill 'x'
killall 'x'
kill -9 'x'

Estas são algumas opções que me disseram para usar até agora, mas algumas pessoas dizem que matar -9 é apenas um exagero, matar por si só não funciona, etc.

Alguém tem algum conselho sobre qual deles deve ser usado no caso mais padrão de apenas encerrar um processo (e, portanto, seu estado também)?

[edit] Estou procurando o que usar quando você deseja interromper a execução do seu processo para poder executar um novo, novo desde o início


11
Veja também a carta do formulário UUK9, que alerta contra abuso SIGKILL.
Jw013

11
Para listar todos os sinais diferentes, junto com seu número: kill -le traduzir um número para o nome do sinal correspondente, por exemplo kill -l 9, retornará KILL.

Respostas:


24

Existem vários sinais cuja disposição padrão é finalizar o processo. O sinal final de terminação é SIGKILL, pois não pode ser tratado e o processo não tem escolha a não ser morrer. No entanto, isso também significa que, se você o enviar, o processo será privado de uma oportunidade de limpeza. Portanto, boas maneiras exigem o envio de um sinal como o SIGTERM, que pode ser tratado primeiro e somente se o processo não terminar após algum tempo, enviá-lo à SIGKILL.

Observe que SIGINT e SIGQUIT não são bons candidatos para o encerramento arbitrário do processo. Devido ao fato de poderem ser gerados a partir do teclado do terminal, muitos aplicativos os utilizam para fins especiais. Por exemplo, o interpretador python usa SIGINT para gerar KeyboardInterruptexceção (também em sessões interativas em python, onde ele simplesmente retorna ao prompt) e a JVM usa SIGQUIT para despejar rastreamentos de pilha. SIGINT e SIGQUIT permanecem eficazes para a maioria dos utilitários de linha de comando padrão, como findou cat.

Durante o desligamento do sistema, a maioria dos sistemas UNIX e Linux envia o SIGTERM para todo o processo, seguido de 5 segundos de espera, seguido pelo SIGKILL. Esta é a maneira recomendada de encerrar com segurança um processo arbitrário.

Observe também que mesmo o SIGKILL pode não finalizar um processo preso em uma espera ininterrupta até que o processo seja ativado.


11
Excelente resposta. Você tem uma referência para a kill -SIGTERM $pid; sleep 5; kill -SIGKILL $pid;recomendação?
L0b0

+1 tipo de resposta. E o SIGHUP?
Alois Mahdal

2
@AloisMahdal: SIGHUPvem do dia em que as linhas dial-up eram comuns. Esse sinal foi enviado para indicar que a linha foi desligada. Mais tarde, quando isso era menos comum, SIGHUPàs vezes era usado pelos daemons para reler o arquivo de configuração sem reiniciar o processo. Nestes tempos modernos, SIGHUPraramente é usado. Muitos daemons terá sua própria maneira de reinicializar (ou seja, apachectl gracefulou rndc reconfigpor coisas que você não deve usar. [init.d|smf|upstart|launchd]Controles sempre que possível.
bahamat

13

Você deve começar com o mais gentil e escalar a partir daí. Isso significa: SIGINT, SIGTERM, SIGQUIT, SIGKILL. Embora a maioria das pessoas pule SIGINT e SIGQUIT.


Além disso, alguns aplicativos (como o JDK) manipulam o SIGQUIT de maneira diferente. Eu provavelmente não usaria o SIGQUIT sem saber como o aplicativo específico lida com isso.
dimo414
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.