我跑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
正規表示式,但不符合固定字串。