~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/daemon.py

Merged from trunk, resolved billions of conflicts

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# daemon code from ASPN
 
2
 
 
3
import os
 
4
 
 
5
 
 
6
def daemonize(pidfile, home):
 
7
    """
 
8
    Detach this process from the controlling terminal and run it in the
 
9
    background as a daemon.
 
10
    """
 
11
 
 
12
    WORKDIR = "/"
 
13
    REDIRECT_TO = getattr(os, 'devnull', '/dev/null')
 
14
    MAXFD = 1024
 
15
 
 
16
    try:
 
17
        pid = os.fork()
 
18
    except OSError, e:
 
19
        raise Exception("%s [%d]" % (e.strerror, e.errno))
 
20
 
 
21
    if pid == 0:      # The first child.
 
22
        os.setsid()
 
23
 
 
24
        try:
 
25
            pid = os.fork()     # Fork a second child.
 
26
        except OSError, e:
 
27
            raise Exception, "%s [%d]" % (e.strerror, e.errno)
 
28
 
 
29
        if pid == 0:  # The second child.
 
30
            os.chdir(WORKDIR)
 
31
        else:
 
32
            os._exit(0) # Exit parent (the first child) of the second child.
 
33
    else:
 
34
        os._exit(0)     # Exit parent of the first child.
 
35
 
 
36
    import resource            # Resource usage information.
 
37
    maxfd = resource.getrlimit(resource.RLIMIT_NOFILE)[1]
 
38
    if (maxfd == resource.RLIM_INFINITY):
 
39
        maxfd = MAXFD
 
40
 
 
41
    fd = os.open(REDIRECT_TO, os.O_RDONLY)
 
42
    os.dup2(fd, 0)
 
43
    fd = os.open(REDIRECT_TO, os.O_WRONLY)
 
44
    os.dup2(fd, 1)
 
45
    os.dup2(fd, 2)
 
46
 
 
47
    # Iterate through and close all other file descriptors.
 
48
    for fd in range(3, maxfd):
 
49
        try:
 
50
            os.close(fd)
 
51
        except OSError:        # ERROR, fd wasn't open to begin with (ignored)
 
52
            pass
 
53
 
 
54
    f = open(pidfile, 'w')
 
55
    f.write('%d\n' % (os.getpid(),))
 
56
    f.write('%s\n' % (home,))
 
57
    f.close()
 
58
 
 
59
 
 
60
def is_running(pidfile):
 
61
    try:
 
62
        f = open(pidfile, 'r')
 
63
    except IOError:
 
64
        return False
 
65
    pid = int(f.readline())
 
66
    f.close()
 
67
    try:
 
68
        os.kill(pid, 0)
 
69
    except OSError:
 
70
        # no such process
 
71
        return False
 
72
    return True