从 GNOME 终端执行父进程时,孤立进程的父 ID 不是 1

use*_*456 5 process terminal process-management init gnome-terminal

我从 GNOME 终端启动一个新进程,然后这个进程 fork 一个孩子。但是当我杀死父进程时,孤立进程的父 id 变成了 1 以外的其他东西,它代表了init --userpid。
当我在虚拟终端中执行此操作时,父 pid 为 1,代表init进程。
如何从 GNOME 终端执行新进程,以便当它死亡时,子进程的父 pid 变为 1 而不是进程的 pid init --user
非常感谢。

Jde*_*eBP 11

几个月前我已经回答了一个类似的问题。因此,请首先查看技术细节。在这里,我将向您展示该答案如何涵盖您的情况。

正如我所解释的,我和其他各种守护进程监督实用程序的作者利用了 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 上,在整个系统中并非如此) Controller 和 Bernstein 的 daemontools 在 1990 年代。在任何情况下,在登录会话中进行双分叉都不会成为守护进程。这是一个众所周知的半生不熟的想法。

如果您错误地认为这是孤儿进程的老生常谈,请再次阅读我之前的答案。孤儿被重新养育以处理 #1 的绝对主义是错误的,并且在撰写本文时已经错误了三年多。

如果您有一个子进程出于某种奇怪的原因确实需要这个,那么找出那个奇怪的原因并修复它。这可能是一个错误,或者有人做出了无效的设计假设。不管是什么原因,守护进程管理的世界在 1990 年代发生了变化,而 Linux 在几年前也发生了变化。是时候迎头赶上了。

进一步阅读