PageRenderTime 46ms CodeModel.GetById 21ms app.highlight 17ms RepoModel.GetById 1ms app.codeStats 0ms

/bangkokhotel/lib/python2.5/site-packages/django/utils/daemonize.py

https://bitbucket.org/luisrodriguez/bangkokhotel
Python | 58 lines | 44 code | 3 blank | 11 comment | 9 complexity | 1f67b6c151ceec92039468634a757526 MD5 | raw file
 1import os
 2import sys
 3
 4if 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
35else:
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