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)

 

posted on 2021-05-07 09:06  fdzwdt  阅读(429)  评论(0编辑  收藏  举报