summaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorRobert Gogolok <gogo@cs.uni-sb.de>2007-12-28 10:26:58 +0000
committerRobert Gogolok <gogo@cs.uni-sb.de>2007-12-28 10:26:58 +0000
commit70a9fa998fb9ded34d74614d0d31219ae279b84c (patch)
treeed89043f5aca2924c0ee3c19bfa0607a1a7c4fb0 /src/lib
parenteec4aa89b3a1713125d0117f7b15fb2a1ce78265 (diff)
downloadbcfg2-70a9fa998fb9ded34d74614d0d31219ae279b84c.tar.gz
bcfg2-70a9fa998fb9ded34d74614d0d31219ae279b84c.tar.bz2
bcfg2-70a9fa998fb9ded34d74614d0d31219ae279b84c.zip
move daemonize support to own module
git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@4113 ce84e21b-d406-0410-9b95-82705330c041
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/Daemon.py44
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())