summaryrefslogtreecommitdiffstats
path: root/src/lib/Daemon.py
blob: bdce2c1793a0ad35e246de73bd305ce9e9d8543a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
'''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, ValueError): 
        # 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:
        try:
            pidfile = open(filename, "w")
            pidfile.write("%i" % pid)
            pidfile.close()
        except:
            print "Failed to write pid file %s" % filename
        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())