Python/System Signals: Difference between revisions

From Fundamental Ramen
Jump to navigation Jump to search
Line 23: Line 23:


== Daemon ==
== Daemon ==
'''daemon_test.py'''


<source lang="python3">
<source lang="python3">
Line 57: Line 59:
         daemon()
         daemon()
</source>
</source>
'''daemon_test.txt '''


<source lang="bash">
<source lang="bash">

Revision as of 02:25, 12 September 2019

Gracefully close a process by signal

import signal

def main():
    close_requested = False

    def on_close(signum, frame):
        nonlocal close_requested
        close_requested = True

    for signum in (signal.SIGHUP, signal.SIGINT, signal.SIGTERM):
        signal.signal(signum, on_close)

    while not close_requested:
        # TODO
        time.sleep(1)

if __name__ == '__main__':
    main()

Daemon

daemon_test.py

import os
import signal
import time

def daemon():
    close_requested = False

    def on_quit(signum, frame):
        nonlocal close_requested
        filepath = os.path.expanduser('~/daemon_test.txt')
        with open(filepath, 'a') as f:
            msg = 'Daemon(%d) closed by signal %d\n' % (os.getpid(), signum)
            f.write(msg)
        close_requested = True

    focused_signals = [
        signal.SIGHUP,  # 1
        signal.SIGINT,  # 2
        signal.SIGQUIT, # 3
        signal.SIGABRT, # 6
        signal.SIGTERM  # 15
    ]
    for sig in (focused_signals):
        signal.signal(sig, on_quit)

    while not close_requested:
        time.sleep(1)

if __name__ == '__main__':
    if os.fork() == 0:
        daemon()

daemon_test.txt

$ tail -f daemon_test.txt 
Daemon(24519) closed by signal 15
Daemon(24900) closed by signal 1
Daemon(25621) closed by signal 2
Daemon(25875) closed by signal 3
Daemon(27255) closed by signal 6