app/django/utils/daemonize.py
changeset 323 ff1a9aa48cfd
parent 54 03e267d67478
equal deleted inserted replaced
322:6641e941ef1e 323:ff1a9aa48cfd
     1 import os
     1 import os
     2 import sys
     2 import sys
     3 
     3 
     4 if os.name == 'posix':
     4 if os.name == 'posix':
     5     def become_daemon(our_home_dir='.', out_log='/dev/null', err_log='/dev/null'):
     5     def become_daemon(our_home_dir='.', out_log='/dev/null',
       
     6                       err_log='/dev/null', umask=022):
     6         "Robustly turn into a UNIX daemon, running in our_home_dir."
     7         "Robustly turn into a UNIX daemon, running in our_home_dir."
     7         # First fork
     8         # First fork
     8         try:
     9         try:
     9             if os.fork() > 0:
    10             if os.fork() > 0:
    10                 sys.exit(0)     # kill off parent
    11                 sys.exit(0)     # kill off parent
    11         except OSError, e:
    12         except OSError, e:
    12             sys.stderr.write("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror))
    13             sys.stderr.write("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror))
    13             sys.exit(1)
    14             sys.exit(1)
    14         os.setsid()
    15         os.setsid()
    15         os.chdir(our_home_dir)
    16         os.chdir(our_home_dir)
    16         os.umask(0)
    17         os.umask(umask)
    17 
    18 
    18         # Second fork
    19         # Second fork
    19         try:
    20         try:
    20             if os.fork() > 0:
    21             if os.fork() > 0:
    21                 os._exit(0)
    22                 os._exit(0)
    30         os.dup2(so.fileno(), sys.stdout.fileno())
    31         os.dup2(so.fileno(), sys.stdout.fileno())
    31         os.dup2(se.fileno(), sys.stderr.fileno())
    32         os.dup2(se.fileno(), sys.stderr.fileno())
    32         # Set custom file descriptors so that they get proper buffering.
    33         # Set custom file descriptors so that they get proper buffering.
    33         sys.stdout, sys.stderr = so, se
    34         sys.stdout, sys.stderr = so, se
    34 else:
    35 else:
    35     def become_daemon(our_home_dir='.', out_log=None, err_log=None):
    36     def become_daemon(our_home_dir='.', out_log=None, err_log=None, umask=022):
    36         """
    37         """
    37         If we're not running under a POSIX system, just simulate the daemon
    38         If we're not running under a POSIX system, just simulate the daemon
    38         mode by doing redirections and directory changing.
    39         mode by doing redirections and directory changing.
    39         """
    40         """
    40         os.chdir(our_home_dir)
    41         os.chdir(our_home_dir)
    41         os.umask(0)
    42         os.umask(umask)
    42         sys.stdin.close()
    43         sys.stdin.close()
    43         sys.stdout.close()
    44         sys.stdout.close()
    44         sys.stderr.close()
    45         sys.stderr.close()
    45         if err_log:
    46         if err_log:
    46             sys.stderr = open(err_log, 'a', 0)
    47             sys.stderr = open(err_log, 'a', 0)