私はこれを実行しようとしています-watch "ps aux | grep myShittyProcess"
tmuxセッションで。このプロセスmyShittyProcess
もtmuxセッションで開始されました。 ps aux
監視コマンドなしで動作します。しかし、私がそれを監視に入れるとすぐに、それは実行に失敗します。これを機能させる方法は?
-編集-
Tmuxをフルスクリーンにリサイズすると動作することがわかりました。 ps
出力ラッピングとgrep
がラップされたコンテキスト内で見つからないことと関係があります。
質問の編集と 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
を使用すると、プロセス名だけでなくコマンドライン引数も検索できます。
実行
watch "COLUMNS= ps aux | grep TheProcessYouWatch"
説明:watch
は、特定の追加の環境変数、つまりCOLUMNS
とLINES
を設定します。これは、env | grep COLUMNS
とwatch 'env | grep COLUMNS'
を比較することで簡単に確認できます。
COLUMNS
が設定されている場合、出力がps
(またはその他)にパイプされている場合でも、grep
はその出力を1行のその数の文字に切り捨てます。 (ps
、なぜ私にこれをするのですか?) COLUMNS
のコマンド内でwatch
を強制的に空にすると、ps
がOP(およびI)の期待どおりに機能するようになります。
ところで、watch
およびgrep
プロセスが監視対象の出力の一部になるのを避けるために、次のように[]
を追加することを検討してください。
watch "COLUMNS= ps aux | grep [T]heProcessYouWatch"
(もちろん、pgrep
にも精通することをお勧めします。他の回答もこれに役立ちます。)
ps
は人間が読める出力を生成するユーティリティであり、人間が読めるテキストのgreppingに依存することは悪い考えです。 pgrep myShittyProcess
の代わりにps aux | grep myShittyProcess
を使用する必要があります。 pgrep
はpidのベアリストを生成します。退屈な出力が必要ない場合は、pgrep
の出力をps
に渡すことができます。
ps -opid,user,args -p `pgrep myShittyProcess`
そのワンライナーをwatch
で使用するには、それを' '
(" "
ではなく)で囲んで、シェルコマンドの早期置換を防ぐ必要があります。
watch 'ps -opid,user,args -p `pgrep myShittyProcess`'