Is it possible to detect and interrupt linux (Ubuntu 16.04) shutdown signal (e.g. power button clicked or runs out of battery). I have a python application that is always re
When linux is shut down, all processes receive SIGTERM
and if they won't terminate after some timeout they are killed with SIGKILL
. You can implement a signal handler to properly shutdown your application using the signal module. systemd
(opposed to upstart
in earlier Ubuntu verions) additionally sends SIGHUP
on shutdown.
To verfiy that this actually works, I tried the following script on two Ubuntu VMs (12.04 and 16.04). The system waits for 10s (12.04/upstart) or 90s (16.04/systemd) before issuing SIGKILL
.
The script ignores SIGHUP
(which would otherwise also kill the process ungracefully) and will continuously print the time since the SIGTERM
signal has been received to a text file.
Note I used disown
(built-in bash command) to detach the process from the terminal.
python signaltest.py &
disown
signaltest.py
import signal
import time
stopped = False
out = open('log.txt', 'w')
def stop(sig, frame):
global stopped
stopped = True
out.write('caught SIGTERM\n')
out.flush()
def ignore(sig, frsma):
out.write('ignoring signal %d\n' % sig)
out.flush()
signal.signal(signal.SIGTERM, stop)
signal.signal(signal.SIGHUP, ignore)
while not stopped:
out.write('running\n')
out.flush()
time.sleep(1)
stop_time = time.time()
while True:
out.write('%.4fs after stop\n' % (time.time() - stop_time))
out.flush()
time.sleep(0.1)
The last line printed into log.txt
was:
10.1990s after stop
for 12.04 and
90.2448s after stop
for 16.04.
Look into this Basically, put a script in /etc/rc0.d/ with the right name and execute a call to you python script.