为什么守护进程需要一个新的 sid?

为什么守护进程需要一个新的 sid?

摘自:http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html#ss4.4

From here, the child process must get a unique SID from the kernel in order to operate. Otherwise, the child process becomes an orphan in the system.

如果子进程变成孤儿进程怎么办?为什么它需要自己的 sid?

答案1

*Nix 进程由 PID(进程 ID)、PPID(父进程的 PID)、GID(组 ID)和 SID(会话 ID)标识。您可以使用以下命令查看它们

 ps  xao pid,ppid,pgid,sid,comm

(包括该command领域,IE引起该过程的命令)。

PID 和 PPID 很容易理解;GID 用于允许中断到达属于同一组的所有进程:假设您正在执行

find / -type f -name '*.pdf' | sort | less

并且您想要suspend这个命令(Ctrl+ Z),您将需要暂停所有进程;为允许这样做,它们属于同一个 GID,并且中断将被传递给具有相同 GID 的所有进程。

SID(会话 ID)是创建会话的进程的 PID。同一会话中随后创建的所有进程都会继承此 SID,尽管它们可能具有不同的组 ID 和 PPID,并且它们肯定具有不同的 PID。

当相关会话终止时(例如通过注销),内核会终止属于相关会话且具有相同 SID 的所有进程。这样做的原因很明显:留下的进程会等待无法再到达的输入,或者会传递无人会查看的输出或错误消息。

为了使服务(我之前的回答没有考虑到您正在讨论的正是服务,抱歉我心不在焉)在启动它的会话注销后继续存在,它不能保留原始会话的 SID,否则它会在注销时被内核删除。因此需要一个新的 SID。如果您不为其分配新的 SID,它将继承运行它的会话的 SID,并且会在会话关闭时被终止,这很可能比您希望服务持续的时间要短得多。

您在上面提到的页面中还有另一个标准(但很可爱)的转折:fork。这也是守护进程在其原始环境消失后继续存在的策略的一部分。您可能已经注意到,守护进程首先从其父进程中分叉,然后在开始工作之前立即关闭父进程。为什么?因为当终端关闭时,它会向其控制进程(shell)发送 SIGHUP 信号。这通常会导致连接到此 shell 的所有进程死亡,因为 shell 会将其收到的 SIGHUP 重新传输到其所有作业。但 shell 不会跟踪其孙子,因此守护进程在其起源的终端关闭后仍然存在。

一旦其中一个消失,将守护进程从会话和终端中分离对于其生存至关重要。

相关内容