Shell

為什麼ps -x |grep foo 是否包含 grep 命令?

  • September 24, 2021

我知道它確實(通常)包括 grep 程序,並且我知道添加 | grep -v grep或 grepping[f]oo會阻止它,但我的問題更多是關於我猜的操作順序。

例如,在這個人為的例子中,我看到了幾個 grep 程序:

% ps -x | grep login | grep login | grep login | grep login
2475 ??         0:00.03 /usr/libexec/loginitemregisterd
2115 ttys004    0:00.04 login -fp jasonerickson
29715 ttys004    0:00.00 grep login
29716 ttys004    0:00.00 grep login
29717 ttys004    0:00.00 grep login
29718 ttys004    0:00.00 grep login

這告訴我ps -x必須在該行最後執行,因為它列出了所有後續的 grep 命令。但是,它並不一致。有時它會列出 4 或 3 或 2 個,甚至沒有 grep 程序。這對我來說意味著它並不總是最後的。

這是怎麼回事?

正如 Bravo 所指出的,Linux 中的管道不是文件,它是動態的。所以ps -x | grep login實際上會同時啟動兩個程序,這樣一個可以向下傾斜,另一個可以捕捉。它不是確定性的,為什麼您的人為範例並不總是顯示四個grep實例的原因是,一個實例可能不會啟動,直到管道中有事情要做;ps或者在讀取程序列表時,有問題的實例可能沒有完全啟動。

Unix是一個多任務作業系統。它不會首先或最後啟動 ps。它並行啟動管道中的所有事情。有些可能先完成或在 ps 開始後開始,這就是你的比賽的來源,這使得結果有點不確定。

基本上,這裡沒有操作順序。管道是數據流,而不是數學公式。

unix 中管道的美妙之處在於,第二個程序可以在第一個程序完成之前開始處理輸入,因此無需在將整個數據流收集並儲存在記憶體(或磁碟)中之前將其提供給下一個程序管子裡的東西。

引用自:https://serverfault.com/questions/1078499