Django

Code

root/django/branches/newforms-admin/django/utils/daemonize.py

Revision 7809, 1.9 kB (checked in by brosner, 5 months ago)

newforms-admin: Merged from trunk up to [7808]. Fixed #7519, #7573

  • Property svn:eol-style set to native
Line 
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
Note: See TracBrowser for help on using the browser.