我写了一个失败不可靠的模糊测试。我添加了一些调试代码,但是现在我想运行测试,直到它失败,这样我就可以收集调试输出。
我已经设置了测试,所以我可以运行它使用:
./runtest
我目前的解决方案是写一个untilfail脚本:
#!/bin/bash
$@
while [ $? -eq 0 ]; do
$@
done
然后使用它:
untilfail ./runtest
有没有更简单的解决办法?
我写了一个失败不可靠的模糊测试。我添加了一些调试代码,但是现在我想运行测试,直到它失败,这样我就可以收集调试输出。
我已经设置了测试,所以我可以运行它使用:
./runtest
我目前的解决方案是写一个untilfail脚本:
#!/bin/bash
$@
while [ $? -eq 0 ]; do
$@
done
然后使用它:
untilfail ./runtest
有没有更简单的解决办法?
While接受要执行的命令,因此您可以使用更简单的
while ./runtest; do :; done
这将在./runtest返回非零退出代码(通常表示失败)时停止循环。
为了进一步简化当前的解决方案,你应该将untilfail脚本更改为如下所示:
#!/bin/bash
while "$@"; do :; done
然后你可以用你已经在使用的命令来调用它:
untilfail ./runTest --and val1,val2 -o option1 "argument two"
如果你不想把一个复杂的管道行包装到一个shell脚本或函数中,那么这是可行的:
while true; do
curl -s "https:..." | grep "HasErrors.:true"
if [[ "$?" -ne 0 ]]; then
break
fi
sleep 120
done
在这种情况下,HTTP请求总是返回200,但也返回一些JSON,其中有一个属性“HasErrors”:true时,有一个错误。
在一个系统中有一个类似的问题,到处都有重复的shell重试逻辑,我制作了一个专门的工具来解决这个问题,称为“重试”:
retry --until=fail ./runtest
一个更复杂的例子:
retry --until=fail --message="test succeeded" --delay=1 ./runtest
工具可从https://github.com/minfrin/retry获得。
在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
你也可以使用带有-e标志的watch命令,该标志将运行该命令,直到出现错误(然后冻结输出,直到按下键):
watch -e ./runtest
使用watch的唯一缺点是运行之间至少有0.1秒的强制延迟:
watch -e ./runtest -n0.1
使用watch,您还可以突出显示运行之间的输出变化(-d)或当命令的输出变化(-g)时退出。