Python way to create a unix daemon
We can easily put a program into background using '&':
python myprogram.py &
But that does not correctly detach the process from the terminal session that started it. So, if I'll close terminal, the program will be terminated.
Here are steps to create a proper daemon:
http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16.
python-daemon package allows us to create a proper unix daemon with ease.
This is a small example of a daemon that saves current time to file every 10 seconds:
# mydaemon.py import os import time from daemon import runner from datetime import datetime class App(): def __init__(self): self.stdin_path = '/dev/null' self.stdout_path = '/dev/tty' self.stderr_path = '/dev/tty' self.pidfile_path = '/var/run/mydaemon.pid' self.pidfile_timeout = 5 def run(self): filepath = '/tmp/mydaemon/currenttime.txt' dirpath = os.path.dirname(filepath) while True: if not os.path.exists(dirpath) or not os.path.isdir(dirpath): os.makedirs(dirpath) f = open(filepath, 'w') f.write(datetime.strftime(datetime.now(), '%Y-%m-%d %H:%M:%S')) f.close() time.sleep(10) app = App() daemon_runner = runner.DaemonRunner(app) daemon_runner.do_action()
Usage:
> python mydaemon.py usage: md.py start|stop|restart > python mydaemon.py start started with pid 8699 > python mydaemon.py stop Terminating on signal 15
Links:
- http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16
- http://www.python.org/dev/peps/pep-3143/
- http://pypi.python.org/pypi/python-daemon/1.6
- https://github.com/arnaudsj/python-daemon
- http://www.gavinj.net/2012/06/building-python-daemon-process.html
- http://stackoverflow.com/questions/10924309/how-can-i-run-my-python-script-in-the-background-on-a-schedule
Licensed under CC BY-SA 3.0