Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How Can Python Handle systemctl stop?

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()
like image 645
Ginger Avatar asked Apr 30 '17 22:04

Ginger


1 Answers

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.

like image 121
Mirek Długosz Avatar answered Oct 21 '22 10:10

Mirek Długosz