Python/System Signals: Difference between revisions
< Python
Jump to navigation
Jump to search
No edit summary |
(→Daemon) |
||
| Line 56: | Line 56: | ||
if os.fork() == 0: | if os.fork() == 0: | ||
daemon() | daemon() | ||
</source> | |||
<source lang="bash"> | |||
$ 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 | |||
</source> | </source> | ||
Revision as of 02:22, 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
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()
$ 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