我正在嘗試
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
設定某些附加環境變量,即COLUMNS
和LINES
。透過比較env | grep COLUMNS
和可以輕鬆驗證這一點watch 'env | grep COLUMNS'
。
COLUMNS
設定後,即使輸出透過管道傳輸(或其他任何內容),ps
也會將其輸出截斷為一行中的多個字元。 grep
(ps
, 你為什麼要這樣對我?)。強制COLUMNS
在 's 命令中為空watch
就足以使ps
工作按 OP(和我)的預期進行。
順便說一句,為了避免watch
和grep
處理成為您監視的輸出的一部分,請考慮[]
像這樣添加:
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`'