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)

 

linux 下通过fork实现后台运行进程

上一篇:jQuery 分割按钮(Split Button)


下一篇:【设计模式】适配器模式 ( 概念 | 适用场景 | 优缺点 | 外观模式对比 | 适配器模式相关角色 | 类适配器 | 对象适配器 | 实现流程 )