ps的COMMAND列中的`init [2]`是什么意思?

n61*_*007 5 ps executable init sysvinit command

阅读进程周围的括号是什么意思?我知道打印了可执行文件名。

Linux ps手册页:

有时进程参数将不可用;发生这种情况时, ps 将改为在括号中打印可执行文件名称。

但是ps -Awwo pid,comm,args我得到:

  PID COMMAND         COMMAND
    1 init            init [2]
Run Code Online (Sandbox Code Playgroud)

这是什么意思?“可执行名称”应该是init还是[2]

我想可执行文件当然是init- 什么是[2]?为什么要打印?

(另外,如果它知道可执行文件名称,我真的不明白为什么它不能显示完整路径。)

Gil*_*il' 7

如果涉及的每个人都遵循默认约定,则输出中的comm列和列的第一个单词都会显示可执行程序的名称。但是,由于各种原因,可能会出现差异。argsps

当程序启动时,args列中显示的命令名称由执行该程序的父程序选择并作为参数 ( argv[0])传递。按照惯例,父级选择可执行文件的基本名称(即没有目录部分的可执行文件的路径),但这不是强制执行的。程序运行后,它可以覆盖该字符串。

Init(至少是传统的Linux SysVinit)覆盖其argv[0]以指示当前运行级别

在 Linux 上,该comm列最初由内核填充到可执行文件基本名称的前 16 个字符。进程可以通过prctl系统调用改变内容。

如果可执行文件被重命名或删除,comm列和args列都不会反映这一点。

ps不显示可执行文件的路径,这不在其工作描述中。lsof可以告诉你lsof -a -p 1 -d txt

在 Linux 上,您可以在以下文件中看到此信息:/proc/PID/

  • commin /proc/1/stat(括号中的第二个字段)和/proc/1/statusName字段)中的进程名称(字段)。
  • 通过/proc/1/exe.
  • 参数(以 开头argv[0]) in /proc/1/cmdline(参数由空字节分隔)。

  • @naxa 是的,`[2]` 中的方括号由`init` 选择,而例如`[kthreadd]` 中的方括号由`ps` 选择。 (2认同)