在bash中重试一系列命令,重试次数有限
我正在寻找一种在bash中实现重试循环机制的好方法 以下是它的工作原理:在bash中重试一系列命令,重试次数有限,bash,Bash,我正在寻找一种在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!"
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!"
每个命令都可能失败,我希望停止运行下一个命令,只需对重试代码执行操作。类似以下操作:
#!/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 == i )) && { echo 'Failed!'; exit 1; }
exit 0
#/bin/bash
重试次数=3次
对于((i=0;i这可能不是最干净的,如果单个命令很长:
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
如果左边的命令成功,则&&&
操作符将运行右边的命令。如果这三个命令都成功,则中断
将退出循环。您可以尝试以下解决方案:
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
多年来,我为此类情况提供了以下“核心”循环:
(r=3;while ! some_cmd ; do ((--r))||exit;sleep 60;done)
这样做的好处是,逻辑自包含在单个语句中,如果命令成功,表达式的计算结果将为true;如果在三次尝试后未成功,表达式的计算结果将为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
这是值得外部化和重用的行为:
见:
这将重试最多3次,然后在每次尝试失败时返回。这是在使用普通的/bin/sh
shell(其中没有bash)时起作用的:
当cmd1成功而cmd2失败时,是否要重试使用cmd1或cmd2启动?在bash中,“retries=3”应该写为“retries=3”。空格会让它变得疯狂。
retry -t 3 pipeline.sh
if [ $? -ne 0 ]; then
echo "Failed"
exit 1
fi
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