Resposta curta : Enviar SIGTERM
, 30 segundos depois SIGKILL
,. Ou seja, mande SIGTERM
, espere um pouco (pode variar de programa para programa, você pode conhecer melhor o seu sistema, mas de 5 a 30 segundos é o suficiente. Ao desligar uma máquina, você pode vê-la esperando automaticamente até 1min30s). Por que a pressa, afinal?), Então envie SIGKILL
.
Resposta razoável : SIGTERM
, SIGINT
, SIGKILL
Isto é mais do que suficiente. O processo muito provavelmente terminará antes SIGKILL
.
Longa Resposta : SIGTERM
, SIGINT
, SIGQUIT
, SIGABRT
,SIGKILL
Isso é desnecessário, mas pelo menos você não está enganando o processo em relação à sua mensagem. Todos estes sinais não significa que você deseja que o processo de parar o que está fazendo e sair.
Não importa a resposta que você escolha nesta explicação, tenha isso em mente!
Se você enviar um sinal que significa outra coisa, o processo pode lidar com isso de maneiras muito diferentes (por um lado). Por outro lado, se o processo não manipular o sinal, não importa o que você envie, o processo será encerrado de qualquer maneira (quando a ação padrão é encerrar, é claro).
Portanto, você deve pensar como um programador. Você codificaria um manipulador de função para, digamos, SIGHUP
encerrar um programa que se conecta a algo, ou faria um loop para tentar se conectar novamente? Essa é a principal questão aqui! É por isso que é importante apenas enviar sinais que significam o que você pretende.
Resposta longa quase estúpida :
A tabela abaixo contém os sinais relevantes e as ações padrão caso o programa não as manipule.
Eu os encomendei na ordem que sugiro usar (BTW, eu sugiro que você use a resposta razoável , não esta aqui), se você realmente precisar experimentar todos (seria divertido dizer que a mesa está ordenada em termos de a destruição que podem causar, mas isso não é totalmente verdade).
Os sinais com um asterisco (*) NÃO são recomendados. O importante é que você nunca sabe o que está programado para fazer. Especialmente SIGUSR
! Pode iniciar o apocalipse (é um sinal gratuito para um programador fazer o que quiser!). Mas, se não for tratado OU no caso improvável de ser tratado para encerrar, o programa será encerrado.
Na tabela, os sinais com opções padrão para encerrar e gerar um core dump são deixados no final, um pouco antes SIGKILL
.
Signal Value Action Comment
----------------------------------------------------------------------
SIGTERM 15 Term Termination signal
SIGINT 2 Term Famous CONTROL+C interrupt from keyboard
SIGHUP 1 Term Disconnected terminal or parent died
SIGPIPE 13 Term Broken pipe
SIGALRM(*) 14 Term Timer signal from alarm
SIGUSR2(*) 12 Term User-defined signal 2
SIGUSR1(*) 10 Term User-defined signal 1
SIGQUIT 3 Core CONTRL+\ or quit from keyboard
SIGABRT 6 Core Abort signal from abort(3)
SIGSEGV 11 Core Invalid memory reference
SIGILL 4 Core Illegal Instruction
SIGFPE 8 Core Floating point exception
SIGKILL 9 Term Kill signal
Então eu sugiro para esta longa resposta quase estúpido :
SIGTERM
, SIGINT
, SIGHUP
, SIGPIPE
, SIGQUIT
, SIGABRT
,SIGKILL
E finalmente, o
Definitivamente estúpido, longa resposta longa :
Não tente isto em casa.
SIGTERM
, SIGINT
, SIGHUP
, SIGPIPE
, SIGALRM
, SIGUSR2
, SIGUSR1
, SIGQUIT
, SIGABRT
, SIGSEGV
, SIGILL
, SIGFPE
E se nada funcionou, SIGKILL
.
SIGUSR2
deve ser tentado antes SIGUSR1
porque é melhor se o programa não lidar com o sinal. E é muito mais provável que funcione SIGUSR1
se manipular apenas um deles.
BTW, o KILL : não é errado enviar SIGKILL
para um processo, como outra resposta afirmava. Bem, pense no que acontece quando você envia um shutdown
comando? Vou tentar SIGTERM
e SIGKILL
só. Por que você acha que é o caso? E por que você precisa de quaisquer outros sinais, se o próprio shutdown
comando usa apenas esses dois?
Agora, de volta à resposta longa , esta é uma linha on-line interessante:
for SIG in 15 2 3 6 9 ; do echo $SIG ; echo kill -$SIG $PID || break ; sleep 30 ; done
Ele dorme por 30 segundos entre os sinais. Por que mais você precisaria de um oneliner ? ;)
Além disso, recomendado: experimente apenas com sinais 15 2 9
da resposta razoável .
segurança : remova o segundo echo
quando estiver pronto para ir. Eu chamo de meu dry-run
para onliners . Sempre use-o para testar.
Script kill graciosamente
Na verdade, fiquei tão intrigado com essa pergunta que decidi criar um pequeno script para fazer exatamente isso. Fique à vontade para fazer o download (clonar) aqui:
Link do GitHub para o repositório Killgracefully