在 tmux 中觀看“ps aux | grep blah”的輸出不起作用?

在 tmux 中觀看“ps aux | grep blah”的輸出不起作用?

我正在嘗試 watch "ps aux | grep myShittyProcess"在 tmux 會話中運行它。這個過程myShittyProcess也是在 tmux 會話中啟動的。ps aux無需手錶命令即可工作。但是一旦我把它放入watch中,它就無法執行。如何讓它發揮作用?

- 編輯 -

發現將 tmux 大小調整為全螢幕可以使其工作。與ps輸出包裝有關,grep無法在包裝上下文中找到。

答案1

正如問題編輯中所提到的xzfc 的回答,問題似乎與 tmux 的換行有關。對於更接近 的直接替換的內容ps aux | grep [q]uote,如果您不需要用戶訊息,請嘗試:

$ pgrep -af [q]uote
392 bash -c sleep 5 && echo quote
399 bash -c sleep 5 && echo second quote

$ watch pgrep -af [q]uote

-a標誌使輸出包含命令列參數,同時-f允許您搜尋命令列參數以及進程名稱。

答案2

跑步

watch "COLUMNS= ps aux | grep TheProcessYouWatch"

說明:watch設定某些附加環境變量,即COLUMNSLINES。透過比較env | grep COLUMNS和可以輕鬆驗證這一點watch 'env | grep COLUMNS'

COLUMNS設定後,即使輸出透過管道傳輸(或其他任何內容),ps也會將其輸出截斷為一行中的多個字元。 grepps, 你為什麼要這樣對我?)。強制COLUMNS在 's 命令中為空watch就足以使ps工作按 OP(和我)的預期進行。

順便說一句,為了避免watchgrep處理成為您監視的輸出的一部分,請考慮[]像這樣添加:

watch "COLUMNS= ps aux | grep [T]heProcessYouWatch"

(當然,我建議也熟悉pgrep一下。其他答案對此會有幫助。)

答案3

ps是產生人類可讀輸出的實用程序,並且依賴 grep 人類可讀文字是個壞主意。您應該使用pgrep myShittyProcess而不是ps aux | grep myShittyProcess.pgrep產生 pid 的裸列表,如果您想要更少無聊的輸出,您可以將pgrep的輸出傳遞給ps

ps -opid,user,args -p `pgrep myShittyProcess`

要使用該單行程式碼,watch應將其括在' '(而不是" ")中,以防止早期 shell 命令替換:

watch 'ps -opid,user,args -p `pgrep myShittyProcess`'

相關內容