为什么要在进程名称周围添加括号?

Ort*_*kni 26 process systemd

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

ps aux | grep pam
Run Code Online (Sandbox Code Playgroud)

我得到

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
Run Code Online (Sandbox Code Playgroud)

(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)");
Run Code Online (Sandbox Code Playgroud)

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

Evg*_*gin 19

在名称周围加上括号似乎表明这个过程有一些特别之处

有两种情况:

  • (...)

当 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) 完成它。


int*_*lfx 5

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

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

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