我从 GNOME 终端启动一个新进程,然后该进程派生一个子进程。但是当我杀死父进程时,孤立进程的父 id 变成了 1 以外的值(代表init --user
pid)。
当我在虚拟终端中执行此操作时,父进程 pid 为 1,代表init
进程。
如何从 GNOME 终端执行新进程,以便当它终止时,子进程的父进程 pid 变为 1 而不是init --user
进程的 pid?
多谢。
答案1
我已经回答了几个月前有过类似的问题。因此,首先请参阅技术细节。在这里,我将向您展示该答案如何涵盖您的情况。
正如我所解释的,我和其他各种守护进程监控实用程序的作者利用 Linux现在有效,你所看到的就是正在运行的东西,几乎与我所展示的一模一样。
唯一缺少的信息是init --user
您的会话实例暴发户的。它在您首次登录会话时启动,并在您注销时停止。您可以在其中进行每个会话的作业(与 MacOS 10 类似,但不完全相同)用户代理下launchd
)你自己的。
几年前,Ubuntu 人员开始转换图形桌面系统,以雇用新贵的按会话工作。您的 GNOME 终端将作为每会话作业启动,并且任何孤儿都会由最近的子收割者继承,这当然是您的新贵的每会话实例。
近几个月来,systemd 人员一直在做同样的事情,设置 GNOME 终端,从每个用户的 systemd 实例中将各个选项卡作为单独的 systemd 服务运行。 (您可以看出您的问题是关于 upstart,而不是 systemd,因为在 systemd 系统上,子收割者进程将是systemd --user
。)
如何从 GNOME 终端执行一个新进程,以便子进程的父 PID 变为 1,而不是 ubuntu 会话 init 进程的 PID?
这是故意为难的。服务经理想跟踪孤立的子进程。他们要不是失去他们去处理#1。所以简单的要点是:停止尝试这样做。
如果您问这个问题只是因为您认为您的流程应该如果父进程 ID 为 1,那么就放弃这个想法。
如果您错误地认为这是守护进程的一个方面,那么请注意,自从 IBM 的系统资源之类的东西出现以来,父进程 ID 为 1 的守护进程还没有得到保证(在某些 Unices 上,整个系统并非如此) 20 世纪 90 年代的 Controller 和 Bernstein 的 daemontools。无论如何,在登录会话中通过双分叉无法成为守护进程。长期以来,人们都认为这是一个不成熟的想法。
如果您错误地认为这对于孤儿进程来说是不言而喻的,那么请再次阅读我之前的答案。孤儿被重新养育以处理#1的绝对主义是错误的,并且在撰写本文时已经错误了三年多。
如果你有一个子进程,由于某种奇怪的原因确实需要这个,然后找出这个奇怪的原因是什么并解决它。这可能是一个错误,或者有人做出了无效的设计假设。不管是什么原因,守护进程管理的世界在 20 世纪 90 年代发生了变化,Linux 几年前也发生了一些变化。是时候追上来了。
进一步阅读
- “会话初始化”。新贵食谱。乌班图。
- 詹姆斯·亨特、斯特凡·格雷伯、德米特里·莱德科夫和史蒂夫·兰加塞克 (2012-11-12)。“重生用户作业和 PID 跟踪”。 Ubuntu Raring 新贵用户会话。乌班图。
- 内森·威利斯 (2013-04-17)。 用户会话新贵。 LWN。
systemd
。 systemd 手册页。 freedesktop.org。