I have a Python script that is running as a service. It writes to disk. If a user calls systemctl stop on the service, I would like to handle the command in my own way to reduce the risk of file corruption.
How can I catch the systemctl stop command?
My file in /usr/lib/systemd/system is:
[Unit]
Description=foo
[Service]
Type=simple
ExecStart=/usr/bin/python /srv/go.py
User=jon
Restart=always
[Install]
WantedBy=graphical.target
My Python script is:
#!/usr/bin/python
import time
import datetime
import threading
def worker():
while True:
with open('/tmp/go.txt', 'a') as f:
s = str(datetime.datetime.utcnow()) + '\n'
f.write(s)
print(s)
time.sleep(1)
if __name__=='__main__':
t = threading.Thread(target=worker)
t.start()
As described in systemd documentation, processes will receive SIGTERM
and then, immediately, SIGHUP
. After some time, SIGKILL
will be send.
All signals, as well as strategy of sending them, can be changed in relevant service file.
See another stackoverflow question to see how handle these signals in your Python program.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With