~canonical-django/canonical-django/project-template

« back to all changes in this revision

Viewing changes to trunk/python-packages/django/utils/daemonize.py

  • Committer: Matthew Nuzum
  • Date: 2008-11-13 05:46:03 UTC
  • Revision ID: matthew.nuzum@canonical.com-20081113054603-v0kvr6z6xyexvqt3
adding to version control

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
import os
 
2
import sys
 
3
 
 
4
if os.name == 'posix':
 
5
    def become_daemon(our_home_dir='.', out_log='/dev/null',
 
6
                      err_log='/dev/null', umask=022):
 
7
        "Robustly turn into a UNIX daemon, running in our_home_dir."
 
8
        # First fork
 
9
        try:
 
10
            if os.fork() > 0:
 
11
                sys.exit(0)     # kill off parent
 
12
        except OSError, e:
 
13
            sys.stderr.write("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror))
 
14
            sys.exit(1)
 
15
        os.setsid()
 
16
        os.chdir(our_home_dir)
 
17
        os.umask(umask)
 
18
 
 
19
        # Second fork
 
20
        try:
 
21
            if os.fork() > 0:
 
22
                os._exit(0)
 
23
        except OSError, e:
 
24
            sys.stderr.write("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror))
 
25
            os._exit(1)
 
26
 
 
27
        si = open('/dev/null', 'r')
 
28
        so = open(out_log, 'a+', 0)
 
29
        se = open(err_log, 'a+', 0)
 
30
        os.dup2(si.fileno(), sys.stdin.fileno())
 
31
        os.dup2(so.fileno(), sys.stdout.fileno())
 
32
        os.dup2(se.fileno(), sys.stderr.fileno())
 
33
        # Set custom file descriptors so that they get proper buffering.
 
34
        sys.stdout, sys.stderr = so, se
 
35
else:
 
36
    def become_daemon(our_home_dir='.', out_log=None, err_log=None, umask=022):
 
37
        """
 
38
        If we're not running under a POSIX system, just simulate the daemon
 
39
        mode by doing redirections and directory changing.
 
40
        """
 
41
        os.chdir(our_home_dir)
 
42
        os.umask(umask)
 
43
        sys.stdin.close()
 
44
        sys.stdout.close()
 
45
        sys.stderr.close()
 
46
        if err_log:
 
47
            sys.stderr = open(err_log, 'a', 0)
 
48
        else:
 
49
            sys.stderr = NullDevice()
 
50
        if out_log:
 
51
            sys.stdout = open(out_log, 'a', 0)
 
52
        else:
 
53
            sys.stdout = NullDevice()
 
54
 
 
55
    class NullDevice:
 
56
        "A writeable object that writes to nowhere -- like /dev/null."
 
57
        def write(self, s):
 
58
            pass