Here’s some useful information for writing daemons in Python.
One common problem that people run into is os.fork() producing zombie processes when children quit. This can easily be overcome by setting the SIGCHLD signal to SIG_IGN. ie:
import signal signal.signal(signal.SIGCHLD, signal.SIG_IGN)
On some flavors of Unix, you are forced to do a double-fork on startup, in order to go into daemon mode. This is because single forking isn’t guaranteed to detach from the controlling terminal. The solution is this:
import os, sys, time
# Main loop
def main():
# Drop privs.
os.setgid(1000) # Replace with desired GID
os.setuid(1000) # Replace with desired UID
time.sleep(10)
sys.exit(0)
if (not os.fork()):
os.setsid() # Become session leader
pid = os.fork()
if (pid):
# Parent, write PID file
fp = open('/var/run/my-daemon.pid', 'w')
fp.write(str(pid))
fp.flush()
# Forcibly sync disk
os.fsync(fp.fileno())
fp.close()
os._exit(0)
else:
# Child, call main
main()
else:
# Parent
os._exit(0)

Posted in
Tags: 



































