【发布时间】:2017-09-09 10:54:44
【问题描述】:
在 Linux 中创建守护进程是 quite complex 的问题,但在 daemon(7) manual 中有很好的记录。幸运的是,Python 2 和 3 的 python-daemon 模块实现了PEP3143,所以我正在使用它。
问题来了:当我在玩python-daemon 模块时,我很惊讶守护进程的PPID 是不是 1。为什么?
简单示例:
import daemon
import time
import os
with open('/tmp/test.log', 'w') as logfile:
c = daemon.DaemonContext(stdout=logfile)
with c:
print('In daemon...')
for i in range(10):
print('My PID is {}, PPID is {}'.format(os.getpid(), os.getppid()))
time.sleep(2)
上述脚本启动20秒后test.log的内容(我推荐tail -f /tmp/test.log):
In daemon...
My PID is 31397, PPID is 1736
My PID is 31397, PPID is 1736
My PID is 31397, PPID is 1736
My PID is 31397, PPID is 1736
My PID is 31397, PPID is 1736
My PID is 31397, PPID is 1736
My PID is 31397, PPID is 1736
My PID is 31397, PPID is 1736
My PID is 31397, PPID is 1736
My PID is 31397, PPID is 1736
原来PID为1736的进程是/lib/systemd/systemd:
patryk@mycomp:/tmp$ ps -fq 1736
UID PID PPID C STIME TTY TIME CMD
patryk 1736 1 0 kwi12 ? 00:00:00 /lib/systemd/systemd --user
最近我在C(在安装了systemd 的同一台机器上)和AFAIR 中实现守护进程,所有守护进程都有PPID = 1。我遇到的所有手册都提到守护进程的PPID 始终是1。
systemd 改了吗? systemd 是否为所有进程处理 awaits - 包括守护进程?它是守护进程的正确行为吗?
相关问题:
【问题讨论】:
标签: python linux pid systemd python-daemon