diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/Daemon.py | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/lib/Daemon.py b/src/lib/Daemon.py new file mode 100644 index 000000000..1886f5569 --- /dev/null +++ b/src/lib/Daemon.py @@ -0,0 +1,44 @@ +'''Bcfg2 daemon support''' +__revision__ = '$Revision' + +import os, sys + +def daemonize(filename): + '''Do the double fork/setsession dance''' + # Check if the pid is active + try: + pidfile = open(filename, "r") + oldpid = int(pidfile.readline()) + # getpgid() will retun an IO error if all fails + os.getpgid(oldpid) + pidfile.close() + + # If we got this far without exceptions, there is another instance + # running. Exit gracefully. + print "PID File (%s) exists and listed PID (%d) is active." % \ + (filename, oldpid) + raise SystemExit, 1 + except OSError: + pidfile.close() + except IOError: + # pid file doesn't + pass + + # Fork once + if os.fork() != 0: + os._exit(0) + os.setsid() # Create new session + pid = os.fork() + if pid != 0: + pidfile = open(filename, "w") + pidfile.write("%i" % pid) + pidfile.close() + os._exit(0) + os.chdir("/") + os.umask(0) + + null = open("/dev/null", "w+") + + os.dup2(null.fileno(), sys.__stdin__.fileno()) + os.dup2(null.fileno(), sys.__stdout__.fileno()) + os.dup2(null.fileno(), sys.__stderr__.fileno()) |