為什麼`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正規表示式,但不符合固定字串。

相關內容