在我的机器上(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) 完成它。
在 /bin/ps 中看起来很漂亮是什么意思,为什么选择 (sd-pam) 而不仅仅是 sd-pam 作为名称?在名称周围加上括号似乎表明这个过程有一些特别之处
是的,它有一些特别之处。这是一个虚构的名称,而不是任何现有二进制文件的名称。换句话说,任何地方都没有“sd-pam”文件;这个进程是 PID 1 的一个分支。
括号可能是为了表明这一点。
归档时间: |
|
查看次数: |
21518 次 |
最近记录: |