How Can Python Handle systemctl stop?

linux, python, systemd

Solution

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.

Problem

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() ```

Original source

Related problems