web/lib/django/utils/daemonize.py
changeset 0 0d40e90630ef
equal deleted inserted replaced
-1:000000000000 0:0d40e90630ef
       
     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