監視: 前回の出力から出力が変更された場合にのみ画面に出力します

監視: 前回の出力から出力が変更された場合にのみ画面に出力します

プロセスを実行していて、スレッドの数を数えています

ps huH p <PID_OF_U_PROCESS> | wc -l

このスレッドは次のように実行できますwatch

watch -n 1 ps huH p <PID_OF_U_PROCESS> | wc -l

これにより、プロセスが実行しているスレッドの数を出力しますが、通常その数は変化しません。

前回コマンドを実行したときから数値が変更された場合にのみ、新しい数値を画面に印刷するにはどうすればよいでしょうか?

例えば:

64 65 64 (数分経過) 65

等。

答え1

次のようにパイプすることもできますuniq:

while ps -o nlwp= -p "$pid"; do sleep 1; done | uniq

答え2

watchこれを直接行うことはできません。コマンド出力の違いを強調表示したり (オプション を使用-d)、出力が変更されたときに終了したり (オプション を使用-g) することはできますが、複数回の実行の出力を表示することはできません。ただし、他の一般的なツールを使用してこれを実現できます。

考えられる多くの解決策の 1 つ:

last=""; while true; do cur="$(ps h -o nlwp -p <PID>)"; if ! [ "$cur" = "$last" ]; then last="$cur"; echo "$(date) $cur"; fi; sleep 1; done

または、もっと読みやすいように:

last=""
while true
do
    cur="$(ps h -o nlwp -p <PID>)"
    if ! [ "$cur" = "$last" ]
    then
        last="$cur"
        echo "$(date) $cur"
    fi
    sleep 1
done

説明:psオプションは-o nlwpスレッド数を直接出力するので、 を呼び出す必要はありませんwc -l$(pidof programname)の代わりにを使って<PID>、プロセス ID を自動的に判別することもできます。 また、 を使って現在の日付も追加しましたが、$(date)これは便利だと思います。気に入らない場合は削除してください。

関連情報