为什么要在进程名称两边添加括号?

为什么要在进程名称两边添加括号?

在我的机器上(Debian 测试), 当我做

ps aux | grep pam

我得到

orto        609  0.0  0.0  58532  2148 ?        S    08:06   0:00 (sd-pam)  
orto       5533  0.0  0.0  12724  1948 pts/1    S+   16:51   0:00 grep pam

(sd-pam)对于一个进程来说,这似乎是一个奇怪的名字。读这篇文章论坛,我发现这个名字是 systemd 故意设置的。在源代码我们看

/* The child's job is to reset the PAM session on
 * termination */

/* This string must fit in 10 chars (i.e. the length
 * of "/sbin/init"), to look pretty in /bin/ps */
rename_process("(sd-pam)");

看起来很漂亮是什么意思?/bin/ps为什么选择它(sd-pam)而不仅仅是sd-pam一个名字?在名称周围加上括号似乎表明该进程有一些特殊的东西,例如内核线程[kintegrityd]

答案1

在名称两边加上括号似乎表明这个过程有一些特殊之处

有两种情况:

  • (...)

当PID 1启动一个服务二进制文件时,它会首先fork出一个进程,然后根据服务配置调整进程的参数,最后调用execve()来执行实际的服务进程。在 fork 和 exec 之间的时间里,我们使用 PR_SET_NAME 将进程的名称更改为将要启动的名称,以便轻松地将其映射到最终启动的服务。但请注意,“comm”名称(即我用 PR_SET_NAME 设置的进程名称,即“顶部”显示的进程名称)有严格的大小限制,这意味着我们必须截断。我们砍掉字符串的开头,因为通常后缀更有趣(否则,systemd 的所有各种服务都会显示为“(systemd-)”——这不是特别有用)。我们将名称括在 () 中,以便澄清这是最终将成为指定进程的进程,但现在还不是。

https://lists.freedesktop.org/archives/systemd-devel/2016-April/036322.html

  • (sd-pam)是特例

如果我们生成一个带有非空“PAMName=”的单元,我们就会分叉一个子进程里面该单元称为“(sd-pam)”,负责监视会话。它等待主进程退出,然后通过 pam_close_session(3) 完成它。

答案2

在 /bin/ps 中看起来很漂亮是什么意思以及为什么选择 (sd-pam) 而不仅仅是 sd-pam 作为名称?在名称两边加上括号似乎表明这个过程有一些特殊之处

是的,它有一些特别的东西。这是一个虚构的名字不是任何现有二进制文件的名称。换句话说,任何地方都没有“sd-pam”文件;该进程是 PID 1 的一个分支。

括号可能是为了表明这一点。

相关内容