Python: Signal Handlers
What is a signal?Permalink
Software interrupts sent to the program to notify on significant event or request the program to run special sequence .
For example, the following command uses SIGHUP signal to request the program to reload it’s configuration
kill -HUP
Anther common signal is the SIGTERM which is used to terminate the program
kill -15 <pid>
In the example above we used the signal number instead of ‘SIGTERM’
Next, I’ll show you how display all the signals and their numbers.
How to list all the signals?Permalink
To list all the signals on your system, you can use ‘kill -l’
> kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
As you can see it prints list of all the signals and their numbers. So if, for example, we want to used SIGKILL to kill a program, we can use it this way:
kill -9 <pid>
How to use signals with Python?Permalink
In Python you have the ‘signal’ module, which is part of the standard library.
Here is an example of how to catch/handle SIGTERM signal sent to your python program
import signal
def signal_terminate_handler(signum, frame):
print "Received signal: {}. You shall not terminate this program!".format(signum)
signal.signal(signal.SIGTERM, signal_terminate_handler)
First step is to import the signal module. Next, we defined function that will handle the signal SIGTERM. First param is signum which is the signal number and the second is frame which is the stack frame.
This is how your signal handle function signature should look like. The content of the function is up to you, in this example I simply printed a specific string. Last line is how we set the signal handler for the signal SIGTERM
Can I define my own signals?Permalink
Yes, for this you have SIGUSR1 and SIGUSR2 which are user defined signals.
signal.signal(signal.SIGUSR2, signal_user_handler)
Comments