web-dev-qa-db-ja.com

tmuxで「psaux | grep blah」の出力を監視しても機能しませんか?

私はこれを実行しようとしています-watch "ps aux | grep myShittyProcess" tmuxセッションで。このプロセスmyShittyProcessもtmuxセッションで開始されました。 ps aux監視コマンドなしで動作します。しかし、私がそれを監視に入れるとすぐに、それは実行に失敗します。これを機能させる方法は?

-編集-

Tmuxをフルスクリーンにリサイズすると動作することがわかりました。 ps出力ラッピングとgrepがラップされたコンテキスト内で見つからないことと関係があります。

8
Shrinath

質問の編集と 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を使用すると、プロセス名だけでなくコマンドライン引数も検索できます。

3
Walt W

実行

watch "COLUMNS= ps aux | grep TheProcessYouWatch"

説明:watchは、特定の追加の環境変数、つまりCOLUMNSLINESを設定します。これは、env | grep COLUMNSwatch 'env | grep COLUMNS'を比較することで簡単に確認できます。

COLUMNSが設定されている場合、出力がps(またはその他)にパイプされている場合でも、grepはその出力を1行のその数の文字に切り捨てます。 (ps、なぜ私にこれをするのですか?) COLUMNSのコマンド内でwatchを強制的に空にすると、psがOP(およびI)の期待どおりに機能するようになります。

ところで、watchおよびgrepプロセスが監視対象の出力の一部になるのを避けるために、次のように[]を追加することを検討してください。

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

(もちろん、pgrepにも精通することをお勧めします。他の回答もこれに役立ちます。)

4
Piotr Findeisen

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`'
2
xzfc