出力が変化しないまでコマンドを観察します。 `watch -g`の逆

出力が変化しないまでコマンドを観察します。 `watch -g`の逆

出力が同じままになるまでコマンドを観察できますか?

を使用すると、watch -gコマンドの結果が変更されたことを確認し、それをトリガーとして使用してスクリプトの次のステップに進むことができます。しかし、コマンドが2回の連続(または定義された連続数)実行で同じ出力を返すことを確認するにはどうすればよいですか?

それはまるで

 watch --exit-on-constant-output --number-of-minimum-identical-runs=10 <command>

現在私が考えることができる唯一の方法は、最初に実行されたときに出力を保存してから、次のように比較するスクリプトです。

#!/bin/bash
breaklimit=4
n=0
old=$(command)
while ((1)) ; do
    current=$(command)
    if [[ "$old" == "$current" ]] ; then
      echo "command gave same output"
      n=$((n+1))
      echo "number of identical, consecutive runs: $n"
      if [[ $n -eq $breaklimit ]] ; then
        break
      fi
    else
      echo "command gave different output"
      old="$current"
      n=0
      sleep 2
    fi
done
echo "run next command"

たとえば、$(($RANDOM/10000))asコマンドを使用するとうまく機能します。しかし、よりエレガントな方法がありますか?

PS:仮想のユースケースが役に立つかもしれません。温度計を加工機に接続し、温度が安定したら生産を開始するとします。したがって、60秒ごとに温度計に現在の温度を問い合わせます。

答え1

これは(Linuxで)うまくいくようです:

while :
do
    timeout 8 watch -g my-command my-args || break
done

メモ:

  1. 「実行回数」を意味するのではなく、出力が等しくなければならない時間(秒)のみを指定します。

  2. my-command実行時に終了したくない場合は、これは適切ではない可能性があります。または、少なくとも-nタイムアウト値と時計のオプションを調整して、これが発生する可能性を減らす必要があります。

説明する:

デフォルトのアイデアは、タイムアウトが期限切れになってもコマンドがまだ実行されている場合、timeoutコマンドはエラー(終了コード124)で終了することです。 (あなたは走ることができます

timeout 2 date; echo $?
timeout 2 sleep 3; echo $?

実際に確認してみてください。

これをと比較しますwatch -g。クロックがタイムアウトする前に終了すると(つまり、出力の変更)、タイムアウトは終了コード0として返され、ループが続行されます。

私の例では、8秒以内に出力が変更されない場合、クロックはタイムアウトで終了し、タイムアウトはエラーで終了し、ループを中断します。

関連情報