我跑ps -ejH | less
。输出还包括ps
和less
。
是什么原因?我认为它会按如下方式工作:
- 首先,
ps
将运行,它将列出当时存在的所有进程。 - 然后, 的输出
ps
将被送入less
。
但根据这个逻辑,两者都不ps
应该less
出现在 的输出中ps
。
那么,为什么这些进程会包含在 的输出中ps
呢?ps
工作方式与我描述的有点不同吗?
答案1
这壳启动两者,以建立管道的两端,因此ps
可以看到自身以及管道另一端的进程。
答案2
“但根据这个逻辑, ps 或 less 都不应该出现在 ps 的输出中。”
是的,所以你的逻辑是错误的,因为它们都出现了。当您在 Un*x shell 中运行命令时,实际上很少有命令(如果有的话)在 shell 中运行。分叉一个单独的进程来运行该命令。
当您通过管道连接两个命令时,两个命令都在单独的进程中启动,并且第一个命令的标准输出链接到第二个命令的标准输入。
因此,执行 ps|less 后不久,就会出现三个进程:一个运行 shell,一个运行 ps,一个运行 less。由于输出是由 ps 生成的,因此它将以 less 并行处理(根据需要进行时间切片)。两个命令并行运行,而不是顺序运行,缓冲最少。
当 ps 遍历进程列表时,它会找到并显示自身和 less,以及父 shell、父 shell 的父 shell,依此类推,直到 init。以及系统上的其他所有内容。这就是为什么你的输出包含 ps 和 less 。
答案3
使用
ps -ef | grep [l]ess
以避免较少。
[l]ess
匹配less
正则表达式,但不匹配固定字符串。