~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/daemon.py

  • Committer: Martin Albisetti
  • Date: 2009-06-01 00:20:43 UTC
  • mfrom: (352.7.3 serve-config)
  • mto: This revision was merged to the branch mainline in revision 364.
  • Revision ID: martin.albisetti@canonical.com-20090601002043-1e0eeztbu6q0xnkk
Merge in Peng's tab fixes

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
# daemon code from ASPN
 
2
#
2
3
 
3
4
import os
4
5
 
9
10
    background as a daemon.
10
11
    """
11
12
 
12
 
    UMASK = 0
13
13
    WORKDIR = "/"
14
14
    REDIRECT_TO = getattr(os, 'devnull', '/dev/null')
15
15
    MAXFD = 1024
19
19
    except OSError, e:
20
20
        raise Exception("%s [%d]" % (e.strerror, e.errno))
21
21
 
22
 
    if (pid == 0):      # The first child.
 
22
    if pid == 0:      # The first child.
23
23
        os.setsid()
24
24
 
25
25
        try:
26
26
            pid = os.fork()     # Fork a second child.
27
27
        except OSError, e:
28
 
            raise Exception, "%s [%d]" % (e.strerror, e.errno)
 
28
            raise Exception("%s [%d]" % (e.strerror, e.errno))
29
29
 
30
 
        if (pid == 0):  # The second child.
 
30
        if pid == 0:  # The second child.
31
31
            os.chdir(WORKDIR)
32
 
            os.umask(UMASK)
33
32
        else:
34
33
            os._exit(0) # Exit parent (the first child) of the second child.
35
34
    else:
36
35
        os._exit(0)     # Exit parent of the first child.
37
36
 
38
 
    #import resource            # Resource usage information.
39
 
    #maxfd = resource.getrlimit(resource.RLIMIT_NOFILE)[1]
40
 
    #if (maxfd == resource.RLIM_INFINITY):
41
 
    #    maxfd = MAXFD
42
 
 
43
 
    # Iterate through and close all file descriptors.
44
 
    #for fd in range(3, maxfd):
45
 
    #    try:
46
 
    #        os.close(fd)
47
 
    #    except OSError:        # ERROR, fd wasn't open to begin with (ignored)
48
 
    #        pass
49
 
 
50
 
    # This call to open is guaranteed to return the lowest file descriptor,
51
 
    # which will be 0 (stdin), since it was closed above.
52
 
    #os.open(REDIRECT_TO, os.O_RDWR)    # standard input (0)
53
 
 
54
 
    # Duplicate standard input to standard output and standard error.
55
 
    #os.dup2(0, 1)                      # standard output (1)
56
 
    #os.dup2(0, 2)                      # standard error (2)
 
37
    import resource            # Resource usage information.
 
38
    maxfd = resource.getrlimit(resource.RLIMIT_NOFILE)[1]
 
39
    if (maxfd == resource.RLIM_INFINITY):
 
40
        maxfd = MAXFD
 
41
 
 
42
    fd = os.open(REDIRECT_TO, os.O_RDONLY)
 
43
    os.dup2(fd, 0)
 
44
    fd = os.open(REDIRECT_TO, os.O_WRONLY)
 
45
    os.dup2(fd, 1)
 
46
    os.dup2(fd, 2)
 
47
 
 
48
    # Iterate through and close all other file descriptors.
 
49
    for fd in range(3, maxfd):
 
50
        try:
 
51
            os.close(fd)
 
52
        except OSError:        # ERROR, fd wasn't open to begin with (ignored)
 
53
            pass
57
54
 
58
55
    f = open(pidfile, 'w')
59
 
    f.write('%d\n' % (os.getpid(),))
60
 
    f.write('%s\n' % (home,))
 
56
    f.write('%d\n' % os.getpid())
61
57
    f.close()
62
58
 
63
59