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() |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #! /usr/bin/python import time import os import logging import daemon def child_process(): logging.info("child process's pid: %d" % os.getpid()) while (1): logging.info("child's still alive.") time.sleep(1) def main(): # DaemonContext 实现了__enter__() 和__exit__(),因此我们可以一句话搞定整个 daemon context with daemon.DaemonContext(): # daemon 目前不支持 log,所以这部分工作只能我们手动初始化 logging.basicConfig(filename='/var/log/mylog.log', level=logging.INFO) child_process() if __name__ == '__main__': main() |
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |