在bash中重试一系列命令的次数有限

时间:2015-10-26 19:17:28

标签: 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!"

每个命令都可能失败,我宁愿停止运行下一个命令而只是重试代码。

6 个答案:

答案 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