linux 下通过fork实现后台运行进程
1 # 通常建议使用双fork方法。在每个fork处,父级退出,子级继续 2 3 #!/usr/bin/env python 4 5 import time,platform 6 7 import os 8 def funzioneDemo(): 9 10 # 这是具体业务函数示例 11 12 fout = open('/tmp/demone.log', 'w') 13 14 while True: 15 16 fout.write(time.ctime()+'\n') 17 18 fout.flush() 19 20 time.sleep(2) 21 22 fout.close() 23 def createDaemon(): 24 25 # fork进程 ,首先fork在setsid之前,确保进程不是进程组领导 26 27 try: 28 29 if os.fork() > 0: os._exit(0) 30 31 except OSError, error: 32 33 print 'fork #1 failed: %d (%s)' % (error.errno, error.strerror) 34 35 os._exit(1) 36 37 os.chdir('/') 38 39 os.setsid() 40 41 os.umask(0) 42 # 在setsid之后的第二个fork确保与控制终端的新关联不会仅仅通过打开终端设备来启动 43 try: 44 45 pid = os.fork() 46 47 if pid > 0: 48 49 print 'Daemon PID %d' % pid 50 51 os._exit(0) 52 53 except OSError, error: 54 55 print 'fork #2 failed: %d (%s)' % (error.errno, error.strerror) 56 57 os._exit(1) 58 59 # 重定向标准IO 60 61 sys.stdout.flush() 62 63 sys.stderr.flush() 64 65 si = file("/dev/null", 'r') 66 67 so = file("/dev/null", 'a+') 68 69 se = file("/dev/null", 'a+', 0) 70 71 os.dup2(si.fileno(), sys.stdin.fileno()) 72 73 os.dup2(so.fileno(), sys.stdout.fileno()) 74 75 os.dup2(se.fileno(), sys.stderr.fileno()) 76 # 在子进程中执行代码 77 78 funzioneDemo() # function demo 79 if __name__ == '__main__': 80 81 if platform.system() == "Linux": 82 83 createDaemon() 84 85 else: 86 87 os._exit(0)