我使用 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.10
并tcsh --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运行tcsh
shell二进制文件,所有三个都是登录外壳,但其中之一处于csh
模式。
A登录外壳只是处于特定交互模式的 shell;该 shell 的行为与执行脚本的 shell 略有不同。可以将其视为一种具有附加功能的模式,使 shell 更易于人类使用,而脚本则不需要这些附加功能。
OP 几乎肯定已经csh
别名为,并且三个 shell 分别使用、和tcsh
开始。要找出命令启动的实际二进制文件,请使用.tcsh -l
csh -l
bin/tcsh -l
realpath $(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” and
comm “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 argument
1529 , and two more arguments
1764 and
1979 (they're argument to
ps itself, not to the
-p option). With a process ID as argument,
ps chooses the BSD output format. You get the same with
ps 1529`。
args
列(别名command
,标题“CMD”)和列(标题“COMMAND”)之间的区别comm
在于,CMD 显示命令行,其中所有参数均以空格分隔(可能被截断),而 COMMAND 仅显示可执行文件名称。按照惯例,程序命令行中的第一个参数(参数编号 0)通常是可执行文件的名称。然而,当 shell 作为登录 shell 被调用时,参数 0 有一个破折号 ( -
) 作为前缀 — 这就是 shell 发现它应该充当登录 shell 的方式。关于这个主题,请参阅登录 Shell 和非登录 Shell 之间的区别?和为什么我们在使用 `--login` 选项调用的登录 shell 上看不到 $0 中的单个连字符?
至于出现csh
与 相对的tcsh
,则表示你跑到csh
某个地方了。您可能没有注意到 ifcsh
只是 的象征性的tcsh
。