在 Linux 中创建守护进程是一个相当复杂的问题,但它在daemon(7) manual
. 值得庆幸的是python-daemon
,Python 2 和 3 的模块实现了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)
test.log
启动上述脚本 20 秒后的内容(我推荐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
所有进程——包括守护进程?这是守护进程的正确行为吗?
相关问题: