Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash中重试一系列命令,重试次数有限_Bash - Fatal编程技术网

在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!"

我正在寻找一种在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!"
每个命令都可能失败,我希望停止运行下一个命令,只需对重试代码执行操作。

类似以下操作:

#!/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