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


19

在我的机器上(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]


“这样做的目的是什么”是什么意思?这是一个名称,可能与它的功能类似(SessionDestroy-PAM?)。
科斯

考虑到您的评论,我已经修改了我的问题。
Ortomala Lokni

抱歉,我不明白您是在说括号。老实说我不知道​​:据此, ps过程的会计名称用括号括起来,并打印出如果要显示的过程已被重命名,如果ps无法通过其原始名称找到该过程,那么当然没有说明为什么pam要在与无关的源代码中完成此操作ps
kos 2015年

1
也许我是下意识地阅读了@kos的评论,但我只是想说这可能是为了避免人们徒劳地寻找名为sd-pam的二进制文件。读完ps已经使用了完全相同的语法后,这可能是故意的。当然,还有其他流程清单工具不会添加括号。(systemd-cgls?)
sourcejedi

2
@kos:“ sd”很可能代表systemd,而不是“ session destroy”。
intelfx

Answers:


15

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

有两种情况:

  • (...)

PID 1启动服务二进制文件时,它将首先派生一个进程,然后根据服务配置调整该进程的参数,最后调用execve()来执行实际的服务进程。在派生和执行之间,我们使用PR_SET_NAME将进程的名称更改为将要启动的名称,以便轻松地将其映射到最终启动的服务。但是请注意,他的“通讯”名称(即我用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)完成它。


5

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

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

括号可能旨在表明这一点。


您是否知道其他进程是否使用相同的约定,这是否是标准约定?
Ortomala Lokni 2015年

@OrtomalaLokni:我不知道有关命名此类进程的任何约定。但是,这并不意味着没有约定。
intelfx
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.