Advertisement
monochromec

Double fork / signal handling

May 9th, 2017
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.06 KB | None | 0 0
  1.  
  2. import sys
  3. import signal
  4. import time
  5. import os
  6. import logging
  7.  
  8. class Handler(object):
  9.     def __init__(self, stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
  10.         self.stdin = stdin
  11.         self.stdout = stdout
  12.         self.stderr = stderr
  13.  
  14.     def daemon(self):
  15.         logging.debug('Before first fork')
  16.         try:
  17.             pid = os.fork()
  18.             if pid > 0:
  19.         #exit first parent
  20.                 sys.exit(0)
  21.         except OSError, e:
  22.             sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror))
  23.             sys.exit(1)
  24.         # decouple from parent environment
  25.         logging.debug('After first fork')
  26.         os.chdir("/")
  27.         os.setsid()
  28.         os.umask(0)
  29.         # do second fork
  30.         try:
  31.             pid = os.fork()
  32.             if pid > 0:
  33.     # exit from second parent
  34.                 sys.exit(0)
  35.         except OSError as e:
  36.             sys.stderr.write("fork #2 failed: %d (%s)\n" % (e.errno, e.strerror))
  37.             sys.exit(1)
  38.     # Redirect standard file descriptors
  39.         logging.debug('After second fork')
  40.         sys.stdout.flush()
  41.         sys.stderr.flush()
  42.         si = file(self.stdin, 'r')
  43.         so = file(self.stdout, 'w+')
  44.         se = file(self.stderr, 'w+', 0)
  45.         os.dup2(si.fileno(), sys.stdin.fileno())
  46.         os.dup2(so.fileno(), sys.stdout.fileno())
  47.         os.dup2(se.fileno(), sys.stderr.fileno())
  48.         logging.debug('before setting signal handlers')
  49.         signal.signal(signal.SIGTERM, self.sigint_handler)
  50.         logging.debug('before while')
  51.         while True:
  52.             sys.stdout.write('.')
  53.             sys.stdout.flush()
  54.             time.sleep(1)
  55.  
  56.     def sigint_handler(self, signum, frame):
  57.         logging.debug('In signal handler')
  58.         os.killpg(0, signal.SIGTERM)
  59.  
  60. def main():
  61.     logging.basicConfig(filename='log', filemode='w',
  62.         level=logging.DEBUG, format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s')
  63.  
  64.     han = Handler()
  65.     han.daemon()
  66.  
  67. ##########
  68.  
  69. if __name__ == "__main__":
  70.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement