反复运行shell命令直到失败?

时间:2012-10-19 04:05:03

标签: bash

我写了fuzzy测试,但是测试失败了。我添加了一些调试代码,但现在我想运行测试直到它失败,所以我可以收集调试输出。

我已经设置了测试,因此我可以使用以下命令运行它:

./runtest

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

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

然后使用它:

untilfail ./runtest

是否有更简单的解决方案?

3 个答案:

答案 0 :(得分:274)

while执行命令,因此您可以使用更简单的

while ./runtest; do :; done

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

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

#!/bin/bash

while $@; do :; done

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

untilfail ./runTest --and val1,val2 -o option1

答案 1 :(得分:5)

如果您不想将复杂的管道线包装到shell脚本或函数中,那么这将起作用:

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

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

答案 2 :(得分:1)

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

retry --until=fail ./runtest

一个更复杂的示例:

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

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