为什么“ps -p proc1 proc2 proc3”显示“-csh”、“-tcsh”和“-/bin/tcsh”,而“ps -p proc[n]”单独显示“tcsh”?

为什么“ps -p proc1 proc2 proc3”显示“-csh”、“-tcsh”和“-/bin/tcsh”,而“ps -p proc[n]”单独显示“tcsh”?

我使用 tcsh(不是 csh),然后运行pgrep csh | xargs ps -p看看为什么我似乎在运行 csh。部分结果:

 1529 pts/0    Ss     0:00 -csh
 1764 pts/3    Ss     0:00 -tcsh
 1979 pts/4    Ss+    0:00 -bin/tcsh

然后我做了ps -p 1529 1764 1979并得到了同样的结果:

  PID TTY      STAT   TIME COMMAND
 1529 pts/0    Ss     0:00 -csh
 1764 pts/3    Ss     0:00 -tcsh
 1979 pts/4    Ss+    0:00 -bin/tcsh

然后我做了ps -p 1529; ps -p 1764; ps -p 1979

  PID TTY          TIME CMD
 1529 pts/0    00:00:00 tcsh
  PID TTY          TIME CMD
 1764 pts/3    00:00:00 tcsh
  PID TTY          TIME CMD
 1979 pts/4    00:00:00 tcsh

ps --version给出procps-ng version 3.3.10tcsh --version产生tcsh 6.19.00 (Astron) 2015-05-21 (x86_64-unknown-linux) options wide,nls,dl,al,kan,sm,rh,color,filec.

为什么会有这种奇怪的行为?我正在尝试编写一个进程监视器,并且让 tcsh 采用三种不同的形式很烦人。

答案1

您正在比较两个不同的领域。

注意标题行。带有破折号的有COMMAND,而带有 tcsh 的有CMD。请参阅标准格式说明符的部分man 1 ps手册页。

本质上:

  • cmd( CMD) 是其所有参数均为字符串的命令。

  • comm( COMMAND) 是进程正在运行的可执行文件的名称。

在 Linux 中,后者还可以设置prctl(PR_SET_NAME, string)为用于整个进程,以及用于pthread_setname_np(thread, string)单个线程。string但限制为 16 个字符。

Shell 通常会根据执行时的符号链接或模式来设置名称,以便进程列表在逻辑上看起来是正确的。特别是,以破折号开头的名称(如-tcsh)用于指示登录壳。

在OP的例子中,有三个shell运行tcshshell二进制文件,所有三个都是登录外壳,但其中之一处于csh模式。

A登录外壳只是处于特定交互模式的 shell;该 shell 的行为与执行脚本的 shell 略有不同。可以将其视为一种具有附加功能的模式,使 shell 更易于人类使用,而脚本则不需要这些附加功能。

OP 几乎肯定已经csh别名为,并且三个 shell 分别使用、和tcsh开始。要找出命令启动的实际二进制文件,请使用.tcsh -lcsh -lbin/tcsh -lrealpath $(which command)

答案2

这是 Linux 命令的一个奇怪之处ps。它尝试模拟多个 Unix 变体的行为ps,并根据您传递的选项猜测变体。这在书中被描述为“个性”手册页

根据猜测的变体,默认的输出字段集有所不同。在 Linux 个性中,ps显示pid(“PID”)、tty(“TTY”)、time(“TIME”) 和args(“CMD”) 列。在 BSD 个性中,ps显示pid“PID”、tty“TTY”、stat “STAT”,时间“TIME” andcomm “COMMAND”.ps -p 1529 is (historically) System V syntax, and in that case Linux chooses the Linux personality.ps -p 1529 1764 1979 has the-p option with the argument1529 , and two more arguments1764 and1979 (they're argument tops itself, not to the-p option). With a process ID as argument,ps chooses the BSD output format. You get the same withps 1529`。

args列(别名command,标题“CMD”)和列(标题“COMMAND”)之间的区别comm在于,CMD 显示命令行,其中所有参数均以空格分隔(可能被截断),而 COMMAND 仅显示可执行文件名称。按照惯例,程序命令行中的第一个参数(参数编号 0)通常是可执行文件的名称。然而,当 shell 作为登录 shell 被调用时,参数 0 有一个破折号 ( -) 作为前缀 — 这就是 shell 发现它应该充当登录 shell 的方式。关于这个主题,请参阅登录 Shell 和非登录 Shell 之间的区别?为什么我们在使用 `--login` 选项调用的登录 shell 上看不到 $0 中的单个连字符?

至于出现csh与 相对的tcsh,则表示你跑到csh某个地方了。您可能没有注意到 ifcsh只是 的象征性的tcsh

相关内容