Python的守护PPID不等于1

问题描述 投票:4回答:2

在Linux中创建守护进程是quite complex的问题,但它在daemon(7) manual非常有据可查。值得庆幸的是还有就是Python 2和实现python-daemon 3 PEP3143模块,所以我使用它。

问题来了:当我用python-daemon模块打我感到惊讶的是守护进程的PPID1。为什么?


简单的例子:

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的内容从开始上述脚本(我建议tail -f /tmp/test.log)20秒后:

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
2个回答
3
投票

简短的回答是:没关系。

最重要的是,所有的守护进程有一个像init父进程死亡时,通过调用wait(),将收获的孩子。否则退出时该进程将变成僵尸。

没有什么特别之处具有1父PID您链接到手册中提到,这个过程是老,SysV的风格守护进程PID 1,但对于新SystemD风格的守护进程没有这么说。 init始终运行如PID 1,和传统上这是守护进程的父。不过,这并不需要如此。

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

阅读* nix中,这是存在了几十年的平台文件时一定要小心。事情的变化和手册变得过时,或者在错误的上下文进行解释。 SystemD带来了很多关于Linux平台的事情发生重大变化。


0
投票

我碰到的所有手册提及,守护进程的PPID始终为1。

这些手册是不正确的;一个守护进程得到任何父母是要管理超脱过程。

如果出现这种情况是init过程,如果init恰巧有PID 1,那么这将是守护进程的PPID;但是这两个都是随意的,没有的定义。手册不应以其他方式暗示。

init过程通常只得到PID 1(显然没有例外),因为,随意,第一个用户空间进程被分配PID 1,这恰好是init,然后永远不会退出,而主机是否在线。没有什么特别的PID否则为1。

systemd过程,同样,得到任何任意PID被分配给它的启动时机。

当他们开始了其他流程管理器,如runit,同样会得到一个任意PID。

你可以张贴到那些犯错手册中的错误报告?

© www.soinside.com 2019 - 2024. All rights reserved.