/bangkokhotel/lib/python2.5/site-packages/django/utils/daemonize.py
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