236

我写了一个不可靠地失败的模糊测试。我添加了一些调试代码,但现在我想运行测试直到它失败,这样我就可以收集调试输出。

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

./runtest

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

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

然后使用它:

untilfail ./runtest

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

4

4 回答 4

403

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

while ./runtest; do :; done

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

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

#!/bin/bash

while "$@"; do :; done

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

untilfail ./runTest --and val1,val2 -o option1 "argument two"
于 2012-10-19T04:09:14.940 回答
17

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

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

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

于 2017-06-02T16:57:17.197 回答
3

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

retry --until=fail ./runtest

一个更复杂的例子:

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

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

于 2020-01-14T08:00:12.753 回答
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

于 2021-12-10T20:16:40.267 回答