【问题标题】:Repeatedly run a shell command until it fails?重复运行一个shell命令直到它失败?
【发布时间】:2012-10-09 15:41:31
【问题描述】:

我编写了一个 fuzzy 测试,但该测试不可靠地失败了。我添加了一些调试代码,但现在我想运行测试直到它失败,以便收集调试输出。

我已经设置了测试,所以我可以使用:

./runtest

我目前的解决方案是写一个untilfail 脚本:

#!/bin/bash
$@
while [ $? -eq 0 ]; do
    $@
done

然后使用它:

untilfail ./runtest

有没有更简单的解决方案?

【问题讨论】:

  • 旁注:习惯性地引用“$@”。

标签: bash


【解决方案1】:

在 Ubuntu 上:

sudo apt-get install run-one
run-one-until-failure COMMAND [ARGS]

更多信息: https://blog.dustinkirkland.com/2013/09/introducing-run-one-constantly-run-one.html

【讨论】:

    【解决方案2】:

    在一个系统中遇到了类似的问题,它的 shell 重试逻辑随处重复,我制作了一个专用工具来解决这个问题,称为“重试”:

    retry --until=fail ./runtest
    

    一个更复杂的例子:

    retry --until=fail --message="test succeeded" --delay=1 ./runtest
    

    工具可从https://github.com/minfrin/retry 获得。

    【讨论】:

      【解决方案3】:

      while 需要一个命令来执行,所以你可以使用更简单的

      while ./runtest; do :; done
      

      ./runtest 返回一个非零退出代码(这通常表示失败)时,这将停止循环。

      不过,为了进一步简化您当前的解决方案,您只需将 untilfail 脚本更改为如下所示:

      #!/bin/bash
      
      while "$@"; do :; done
      

      然后你可以用你已经在使用的任何命令来调用它:

      untilfail ./runTest --and val1,val2 -o option1 "argument two"
      

      【讨论】:

      • 还可以指出[ 是一个命令。对于新用户来说,[ifwhile 语法的一部分是一个常见的误解。
      • 我怎样才能知道它在失败前运行了多少次?
      • @GrantJ:实际上非常简单。将count=0 放在循环之前,然后将: 放在循环中(无操作)而不是(( count++ )) - 这会增加计数器。
      • 生产力小窍门:如果您使用的是带有 say 和扬声器的系统,您可以使用 while ./runtest; do :; done && say test failed 在停止时收到通知
      • @Schneems:值得注意的是,say 是特定于 macOS 的。
      【解决方案4】:

      如果您不想将复杂的管道包装到 shell 脚本或函数中,那么这样可以:

      while true; do 
        curl -s "https:..." | grep "HasErrors.:true"
        if [[ "$?" -ne 0 ]]; then 
          break
        fi
        sleep 120
      done
      

      在这种情况下,HTTP 请求总是返回 200,但当出现错误时,还会返回一些具有属性“HasErrors”的 JSON:true。

      【讨论】:

        猜你喜欢
        • 2016-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-13
        • 1970-01-01
        • 2019-11-10
        • 2015-11-14
        • 1970-01-01
        相关资源
        最近更新 更多