為什麼`ps -x | grep foo` 包含 grep 指令嗎?

為什麼`ps -x | grep foo` 包含 grep 指令嗎?

我知道它(經常)包括 grep 進程,我知道添加| grep -v grep或 grep[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 進程,甚至不列出任何 grep 進程。這對我來說意味著它不是總是最後的。

這是怎麼回事?

答案1

正如 Bravo 指出的那樣,Linux 中的管道不是文件,而是動態的。因此,ps -x | grep login實際上會同時啟動兩個程序,這樣一個程序可以向下傾斜管道,另一個程序可以接住管道。它不是確定性的,為什麼你設計的範例並不總是顯示四個grep實例,是因為一個實例可能不會啟動,直到管道中有東西可以做;或在ps讀取進程列表時相關實例可能未完全啟動。

答案2

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

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

unix 中管道的優點在於,第二個程式可以在第一個程式完成之前開始處理輸入,因此無需在將整個資料流傳遞給下一個程式之前將其收集並儲存在記憶體(或磁碟)中。裡的東西。

相關內容