/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

  1. import os
  2. import sys
  3. if os.name == 'posix':
  4. def become_daemon(our_home_dir='.', out_log='/dev/null',
  5. err_log='/dev/null', umask=022):
  6. "Robustly turn into a UNIX daemon, running in our_home_dir."
  7. # First fork
  8. try:
  9. if os.fork() > 0:
  10. sys.exit(0) # kill off parent
  11. except OSError, e:
  12. sys.stderr.write("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror))
  13. sys.exit(1)
  14. os.setsid()
  15. os.chdir(our_home_dir)
  16. os.umask(umask)
  17. # Second fork
  18. try:
  19. if os.fork() > 0:
  20. os._exit(0)
  21. except OSError, e:
  22. sys.stderr.write("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror))
  23. os._exit(1)
  24. si = open('/dev/null', 'r')
  25. so = open(out_log, 'a+', 0)
  26. se = open(err_log, 'a+', 0)
  27. os.dup2(si.fileno(), sys.stdin.fileno())
  28. os.dup2(so.fileno(), sys.stdout.fileno())
  29. os.dup2(se.fileno(), sys.stderr.fileno())
  30. # Set custom file descriptors so that they get proper buffering.
  31. sys.stdout, sys.stderr = so, se
  32. else:
  33. def become_daemon(our_home_dir='.', out_log=None, err_log=None, umask=022):
  34. """
  35. If we're not running under a POSIX system, just simulate the daemon
  36. mode by doing redirections and directory changing.
  37. """
  38. os.chdir(our_home_dir)
  39. os.umask(umask)
  40. sys.stdin.close()
  41. sys.stdout.close()
  42. sys.stderr.close()
  43. if err_log:
  44. sys.stderr = open(err_log, 'a', 0)
  45. else:
  46. sys.stderr = NullDevice()
  47. if out_log:
  48. sys.stdout = open(out_log, 'a', 0)
  49. else:
  50. sys.stdout = NullDevice()
  51. class NullDevice:
  52. "A writeable object that writes to nowhere -- like /dev/null."
  53. def write(self, s):
  54. pass