为什么`ps -e | less` 在进程中显示“less”?

为什么`ps -e | less` 在进程中显示“less”?

我跑ps -ejH | less。输出还包括psless

是什么原因?我认为它会按如下方式工作:

  1. 首先,ps将运行,它将列出当时存在的所有进程。
  2. 然后, 的输出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正则表达式,但不匹配固定字符串。

相关内容