gpt4 book ai didi

Python 的守护进程 PPID 不等于 1

转载 作者:IT王子 更新时间:2023-10-29 01:25:44 25 4
gpt4 key购买 nike

在 Linux 中创建守护进程是 quite complex问题,但它在 daemon(7) manual 中有很好的记录.谢天谢地有 python-daemon实现 PEP3143 的 Python 2 和 3 模块,所以我正在使用它。

问题来了:我在玩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对于所有进程——包括守护进程?这是守护进程的正确行为吗?


相关问题:

最佳答案

简短的回答是:没关系。

重要的是所有守护进程都有一个像 init 这样的父进程,当它们死去时,通过调用 wait() 来收割子进程。否则进程在退出时将变成僵尸

父 PID 为 1 并没有什么特别之处。您链接到的手册页说此进程对于旧的 SysV 风格的守护进程来说是 PID 1,但对于新的 SystemD 风格的守护进程则没有这样说。 init 总是作为 PID 1 运行,传统上它是守护进程的父进程。但它并不需要如此。

systemd --user管理用户服务。因此,当您(作为用户)运行它时,为什么这个进程成为您的守护进程的父进程是有道理的。

阅读关于 *nix 的文档时必须小心,*nix 是一个已经存在了几十年的平台。事情发生变化,手册变得过时,或者可以在错误的上下文中进行解释。 SystemD 为 Linux 平台很多带来了重大变化。

关于Python 的守护进程 PPID 不等于 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43390211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com