1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
| #! /usr/bin/python
import time
import sys
import os
import logging
def child_process():
logging.info("child process's pid: %d" % os.getpid())
while (1):
logging.info("child's still alive.")
time.sleep(1)
def fork_and_exit_parent_proc():
# 因为 multiprocessing.Process 的既定设计是只在子进程中运行 target 参数所指向的函数对象
# 因此这里我们必须回归传统的 fork
pid = os.fork()
if pid > 0:
os._exit(0)
def become_daemon(target):
# 1. 第一次 fork
fork_and_exit_parent_proc()
# 2. 创建新会话
os.setsid()
# 3. 第二次 fork
fork_and_exit_parent_proc()
# 4. 将工作目录切换至 '/'
os.chdir('/')
# 5. 重定向标准输入、输出、错误至/dev/null
fd = os.open(os.devnull, os.O_RDWR)
os.dup2(fd, sys.stdin.fileno())
os.dup2(fd, sys.stdout.fileno())
os.dup2(fd, sys.stderr.fileno())
# 6. 因为标准输出不可用,这里笔者又额外定义了一个 log 文件以接收守护进程的输出
logging.basicConfig(filename='/var/log/mylog.log', level=logging.INFO)
target()
def main():
becomeDaemon(target=child_process)
if __name__ == '__main__':
main()
|