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

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

阅读进程周围的括号是什么意思?据我所知,可执行文件名称已打印。

Linux附注手册页:

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

然而ps -Awwo pid,comm,args我得到:

  PID COMMAND         COMMAND
    1 init            init [2]

这是什么意思? “可执行文件名称”应该是initor吗[2]

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

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

答案1

如果涉及的每个人都遵循默认约定,则输出中的列和列的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/

  • (括号中的第二个字段)和(字段)comm中的进程名称(字段) 。/proc/1/stat/proc/1/statusName
  • 通过 的可执行文件的路径/proc/1/exe
  • 中的参数(以 开头argv[0]/proc/1/cmdline(参数由空字节分隔)。

相关内容