观察命令,直到输出保持不变。 `watch -g` 的逆

观察命令,直到输出保持不变。 `watch -g` 的逆

是否有可能观察命令直到输出保持不变?

使用watch -g,可以检查命令结果是否发生更改,并将其用作触发器以转到脚本中的下一步。但是,如果我想检查命令在两次连续(或定义的连续次数)运行中返回相同的输出,该怎么办?

就像是

 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需要调整超时值和手表的选项以减少发生这种情况的机会。

解释:

基本思想是,如果超时结束时命令仍在运行,则超时命令将退出并出现错误(退出代码 124)。 (你可以运行

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

看看它的实际效果。

我们将其与watch -g.如果 watch 在超时之前退出(即输出发生变化),则超时返回,退出代码为 0,并且循环继续。

如果输出在(在我的示例中)8秒内没有改变,watch将被超时终止,并且超时将退出并出现错误,并中断循环。

相关内容