我正在寻找一种在bash中实现重试循环机制的简洁方法。
以下是应该如何运作:
retries = 3
while retries:
cmd1
cmd2
cmd3
if not_error:
break
echo "something went wrong, let's wait 60 seconds and retry"
sleep 60
retries --
if retries = 0:
exit "Failed!"
每个命令都可能失败,我宁愿停止运行下一个命令而只是重试代码。
答案 0 :(得分:1)
这样的事情:
#!/bin/bash
retries=3
for ((i=0; i<retries; i++)); do
cmd1 && cmd2 && cmd3
[[ $? -eq 0 ]] && break
echo "something went wrong, let's wait 60 seconds and retry"
sleep 60
done
[[ $retries -eq i ]] && { echo "Failed!"; exit 1; }
答案 1 :(得分:1)
如果单个命令很长,这可能不是最干净的:
retries=3
while ((retries > 0)); do
cmd1 &&
cmd2 &&
cmd3 && break
echo "something went wrong, let's wait 60 seconds and retry"
sleep 60
((retries --))
done
if ((retries == 0 )); then
echo "Failed!"
exit 1
fi
&&
运算符如果左侧的命令成功,则在其右侧运行命令。如果所有三个都成功,则break
退出循环。
答案 2 :(得分:0)
您可以尝试此解决方案:
retries=3
while [ retries gt 0 ]; do
if cmd1 && cmd2 && cmd3; then
echo "Passed!"
exit 0
else
echo "something went wrong, let's wait 60 seconds and retry"
sleep 60
((retries --))
fi
done
echo "Failed!"
exit 1
答案 3 :(得分:0)
多年来,我为这种情况带来了以下“核心”循环:
(r=3;while ! some_cmd ; do ((--r))||exit;sleep 60;done)
这样做的好处是逻辑可以自包含到单个语句中,如果命令成功,表达式将评估为true,如果3次尝试之后没有,则表达式将为false。如果您使用set -e
运行,或者使用该命令的多次重试替换现有的简单命令,这非常有用。
在您的情况下,这可以转化为:
if ! (r=3; while ! { cmd1 && cmd2 && cm3 ; } ; do
((--r)||exit
echo "something went wrong, let's wait 60 seconds and retry"
sleep 60;done) ; then
echo "Failed!"
exit 1
fi
echo "Passed!"
exit 0
答案 4 :(得分:0)
这是值得外化和重用的行为:
请参阅:https://github.com/kadwanev/retry
retry -t 3 pipeline.sh
if [ $? -ne 0 ]; then
echo "Failed"
exit 1
fi
这将重试最多3次,然后在每次尝试失败时返回。
答案 5 :(得分:0)
当使用普通的 /bin/sh
shell(其中 bash 不可用)时,这是有效的:
retries=3
while [[ $retries -gt 0 ]]; do
if cmd1 && cmd2 && cmd3; then
echo "Passed!"
exit 0
else
echo "something went wrong, let's wait 2 seconds and retry"
sleep 2
retries=$((retries - 1))
fi
done
echo "Failed!"
exit 1