![为什么要在进程名称两边添加括号?](https://linux22.com/image/68117/%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E5%9C%A8%E8%BF%9B%E7%A8%8B%E5%90%8D%E7%A7%B0%E4%B8%A4%E8%BE%B9%E6%B7%BB%E5%8A%A0%E6%8B%AC%E5%8F%B7%EF%BC%9F.png)
在我的机器上(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 的一个分支。
括号可能是为了表明这一点。