1. import sys,os   
  2. import time    
  3. def main():       
  4.     for i in range(30):     
  5.         os.system("echo '%d' >> hello.txt"%i)     
  6.         time.sleep(10)     
  7. if __name__ == "__main__":     
  8.     try:     
  9.         pid = os.fork()     
  10.         if pid > 0:    
  11.             # exit first parent    
  12.             sys.exit(0)     
  13.     except OSError, e:     
  14.         print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror)     
  15.         sys.exit(1)    
  16.     # decouple from parent environment    
  17.     os.chdir("/")     
  18.     os.setsid()     
  19.     os.umask(0)     
  20.     # do second fork    
  21.     try:     
  22.         pid = os.fork()     
  23.         if pid > 0:    
  24.             # exit from second parent, print eventual PID before    
  25.             print "Daemon PID %d" % pid     
  26.             sys.exit(0)     
  27.     except OSError, e:     
  28.         print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror)     
  29.         sys.exit(1)     
  30.    
  31.     main() 

 

运行的时候,主进程调用os.fork()创建子进程。若pid>0就是自己,自杀。子进程跳过if语句,通过os.setsid()成为linux中的独立于终端的进程(不响应sigint,sighup等)。第二次os.fork再创建一个子进程,自己自杀。原因是os.setsid()调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离。由于会话过程对控制终端的独占性,进程同时与控制终端脱离。这次创建的进程真的daemon,并且外界对它影响被控制在最小。