Risposta breve : Invia SIGTERM
, 30 secondi più tardi, SIGKILL
. Cioè, invia SIGTERM
, aspetta un po '(può variare da programma a programma, potresti conoscere meglio il tuo sistema, ma da 5 a 30 secondi sono sufficienti. Quando spegni una macchina, potresti vederla aspettare automaticamente fino a 1'30 s. Perché la fretta, dopo tutto?), Quindi inviare SIGKILL
.
Risposta ragionevole : SIGTERM
, SIGINT
, SIGKILL
Questo è più che sufficiente. Il processo molto probabilmente terminerà prima SIGKILL
.
Lungo Risposta : SIGTERM
, SIGINT
, SIGQUIT
, SIGABRT
,SIGKILL
Questo non è necessario, ma almeno non stai fuorviando il processo relativo al tuo messaggio. Tutti questi segnali non significa che si desidera che il processo per fermare quello che sta facendo e uscire.
Non importa quale risposta scegli da questa spiegazione, tienilo a mente!
Se invii un segnale che significa qualcos'altro, il processo potrebbe gestirlo in modi molto diversi (da un lato). D'altra parte, se il processo non gestisce il segnale, non importa cosa invii dopotutto, il processo si chiuderà comunque (quando l'azione predefinita è terminare, ovviamente).
Quindi, devi pensare come te stesso come un programmatore. Codifichereste un gestore di funzioni per, diciamo, SIGHUP
chiudere un programma che si connette a qualcosa, o lo fareste in loop per provare a connettervi di nuovo? Questa è la domanda principale qui! Ecco perché è importante inviare solo segnali che significano ciò che intendi.
Risposta lunga quasi stupida :
La tabella seguente contiene i segnali rilevanti e le azioni predefinite nel caso in cui il programma non li gestisca.
Li ho ordinati nell'ordine che suggerisco di usare (a proposito, ti consiglio di usare la risposta ragionevole , non questa qui), se hai davvero bisogno di provarli tutti (sarebbe divertente dire che la tabella è ordinata in termini di la distruzione che possono causare, ma non è completamente vero).
I segnali con un asterisco (*) NON sono consigliati. La cosa importante di questi è che potresti non sapere mai cosa è programmato per fare. Specialmente SIGUSR
! Potrebbe iniziare l'apocalisse (è un segnale gratuito per un programmatore che fa quello che vuole!). Ma, se non gestito O nel caso improbabile che venga gestito per terminare, il programma terminerà.
Nella tabella, i segnali con le opzioni predefinite per terminare e generare un core dump vengono lasciati alla fine, appena prima 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
Poi vorrei suggerire per questa lunga risposta quasi stupido :
SIGTERM
, SIGINT
, SIGHUP
, SIGPIPE
, SIGQUIT
, SIGABRT
,SIGKILL
E infine, il
Risposta decisamente lunga e lunga :
Non provarlo a casa.
SIGTERM
, SIGINT
, SIGHUP
, SIGPIPE
, SIGALRM
, SIGUSR2
, SIGUSR1
, SIGQUIT
, SIGABRT
, SIGSEGV
, SIGILL
, SIGFPE
E se niente ha funzionato, SIGKILL
.
SIGUSR2
dovrebbe essere provato prima SIGUSR1
perché è meglio se il programma non gestisce il segnale. Ed è molto più probabile che gestisca SIGUSR1
se ne gestisce solo uno.
A proposito, il KILL : non è sbagliato inviare SIGKILL
a un processo, come affermava un'altra risposta. Bene, pensi cosa succede quando invii un shutdown
comando? Ci proverà SIGTERM
e SIGKILL
solo. Perché pensi che sia così? E perché hai bisogno di altri segnali, se il shutdown
comando stesso utilizza solo questi due?
Ora, tornando alla risposta lunga , questo è un bel oneliner:
for SIG in 15 2 3 6 9 ; do echo $SIG ; echo kill -$SIG $PID || break ; sleep 30 ; done
Dorme per 30 secondi tra i segnali. Perché altrimenti avresti bisogno di un oneliner ? ;)
Inoltre, consigliato: provalo solo con segnali 15 2 9
dalla risposta ragionevole .
sicurezza : togli la seconda echo
quando sei pronto per partire. Lo chiamo mio dry-run
per gli onliner . Usalo sempre per testare.
Script killgracefully
In realtà ero così incuriosito da questa domanda che ho deciso di creare una piccola sceneggiatura per fare proprio questo. Per favore, sentiti libero di scaricarlo (clonarlo) qui:
Collegamento GitHub al repository Killgracefully