In a comment on this answer of another question, the commenter says:
don’t use kill -9 unless absolutely necessary! SIGKILL can’t be trapped so the killed program can’t run any shutdown routines to e.g. erase temporary files. First try HUP (1), then INT (2), then QUIT (3)
I agree in principle about SIGKILL
, but the rest is news to me. Given that the default signal sent by kill
is SIGTERM
, I would expect it is the most-commonly expected signal for graceful shutdown of an arbitrary process. Also, I have seen SIGHUP
used for non-terminating reasons, such as telling a daemon "re-read your config file." And it seems to me that SIGINT
(the same interrupt you'd typically get with Ctrl-C, right?) isn't as widely supported as it ought to be, or terminates rather ungracefully.
Given that SIGKILL
is a last resort — Which signals, and in what order, should you send to an arbitrary process, in order to shut it down as gracefully as possible?
Please substantiate your answers with supporting facts (beyond personal preference or opinion) or references, if you can.
Note: I am particularly interested in best practices that include consideration of bash/Cygwin.
Edit: So far, nobody seems to mention INT or QUIT, and there's limited mention of HUP. Is there any reason to include these in an orderly process-killing?
Short Answer: Send
SIGTERM
, 30 seconds later,SIGKILL
. That is, sendSIGTERM
, wait a bit (it may vary from program to program, you may know your system better, but 5 to 30 seconds is enough. When shutting down a machine, you may see it automatically waiting up to 1'30s. Why the hurry, after all?), then sendSIGKILL
.Reasonable Answer:
SIGTERM
,SIGINT
,SIGKILL
This is more than enough. The process will very probably terminate beforeSIGKILL
.Long Answer:
SIGTERM
,SIGINT
,SIGQUIT
,SIGABRT
,SIGKILL
This is unnecessary, but at least you are not misleading the process regarding your message. All these signals do mean you want the process to stop what it is doing and exit.
No matter what answer you choose from this explanation, keep that in mind!
If you send a signal that means something else, the process may handle it in very different ways (on one hand). On the other hand, if the process doesn't handle the signal, it doesn't matter what you send after all, the process will quit anyway (when the default action is to terminate, of course).
So, you must think as yourself as a programmer. Would you code a function handler for, lets say,
SIGHUP
to quit a program that connects with something, or would you loop it to try to connect again? That is the main question here! That is why it is important to just send signals that mean what you intend.Almost Stupid Long Answer:
The table bellow contains the relevant signals, and the default actions in case the program does not handle them.
I ordered them in the order I suggest to use (BTW, I suggest you to use the reasonable answer, not this one here), if you really need to try them all (it would be fun to say the table is ordered in terms of the destruction they may cause, but that is not completely true).
The signals with an asterisk (*) are NOT recommended. The important thing about these is that you may never know what it is programmed to do. Specially
SIGUSR
! It may start the apocalipse (it is a free signal for a programmer do whatever he/she wants!). But, if not handled OR in the unlikely case it is handled to terminate, the program will terminate.In the table, the signals with default options to terminate and generate a core dump are left in the end, just before
SIGKILL
.Then I would suggest for this almost stupid long answer:
SIGTERM
,SIGINT
,SIGHUP
,SIGPIPE
,SIGQUIT
,SIGABRT
,SIGKILL
And finally, the
Definitely Stupid Long Long Answer:
Don't try this at home.
SIGTERM
,SIGINT
,SIGHUP
,SIGPIPE
,SIGALRM
,SIGUSR2
,SIGUSR1
,SIGQUIT
,SIGABRT
,SIGSEGV
,SIGILL
,SIGFPE
and if nothing worked,SIGKILL
.SIGUSR2
should be tried beforeSIGUSR1
because we are better off if the program doesn't handle the signal. And it is much more likely for it to handleSIGUSR1
if it handles just one of them.BTW, the KILL: it is not wrong to send
SIGKILL
to a process, as other answer stated. Well, think what happens when you send ashutdown
command? It will trySIGTERM
andSIGKILL
only. Why do you think that is the case? And why do you need any other signals, if the veryshutdown
command uses only these two?Now, back to the long answer, this is a nice oneliner:
It sleeps for 30 seconds between signals. Why else would you need a oneliner? ;)
Also, recommended: try it with only signals
15 2 9
from the reasonable answer.safety: remove the second
echo
when you are ready to go. I call it mydry-run
for onliners. Always use it to test.Script killgracefully
Actually I was so intrigued by this question that I decided to create a small script to do just that. Please, feel free to download (clone) it here:
GitHub link to Killgracefully repository