以下命令不返回任何结果
ps -C init -o pid=
ps -C /sbin/init -o pid=
pgrep -x /sbin/init
其中,以下命令给出的输出如下:
$ ps -ealf | grep init
4 S root 1 0 0 80 0 - 6266 - 08:35 ? 00:00:03 /sbin/init auto noprompt
$ pidof init
1
我想知道如何使用ps -C和pgrep方法获取初始化进程的 PID。我在这里做错了什么?
我在内核 4.10.0-27-generic 32 位的 Ubuntu 16.04.3 LTS
在 Ubuntu 16.04 上,
/sbin/init
是 systemd 的符号链接:ps -C
读取/proc/<pid>/stat
. 见man 5 proc
:由于 systemd 支持以 init 重新执行自身(例如,
systemctl daemon-reexec
),因此它会尝试尽快将其更改systemd
为 ,如果以/sbin/init
. 从来源:因此,
ps -C init
不会匹配 PID 1 的 systemd。使用pgrep
,您可以使用-f
.pgrep -f
检查/proc/<pid>/cmdline
,并且 systemd 不会尝试更改它。systemd
输出中的第二个ps
是我的用户会话初始化。任何使用没有 sysvcompat 的 systemd 的系统都会表现得像这样。即使 /sbin/init 是指向 systemd 的链接,命令名称仍然是 systemd。当使用 ps 的 -C 选项时,这只会查找 systemd。当使用 ps 的 -f 选项时,表示完整格式在 CMD 列中打印命令参数(args)而不是命令名称(comm),并且确实 systemd 正在开始使用该文件
/sbin/init
试试这个命令:
实际上,如果它有任何参数,这也将包括其他参数,这也意味着由于符号链接,Unix 中的参数可以导致它们指向的命令名称完全不同。