実行を最大5回まで再試行するには、スクリプトに再試行ロジックを作成する必要がありますか?

実行を最大5回まで再試行するには、スクリプトに再試行ロジックを作成する必要がありますか?

次の条件に従って、15秒後に最大5回の実行を再試行するロジックをシェルスクリプトに書きたいと思います。「ステータスコード=失敗」いくつかの問題が原因で失敗した場合。

答え1

for i in 1 2 3 4 5; do command && break || sleep 15; done

"command"を希望のコマンドに置き換えます。これは、「状態コード=失敗」がゼロ以外の戻りコードを意味すると仮定する。


多様性:

構文を使用してください{..}。ほとんどのシェルでは機能しますが、BusyBoxでは機能しませんsh

for i in {1..5}; do command && break || sleep 15; done

seq失敗したコマンドの終了コードを使用して渡します。

for i in $(seq 1 5); do command && s=0 && break || s=$? && sleep 15; done; (exit $s)

上記と同じですが、sleep 15最終失敗後にスキップしました。最大ループ数を一度だけ定義するのが最善であるため、ループの先頭で休止を実行するだけですi > 1

for i in $(seq 1 5); do [ $i -gt 1 ] && sleep 15; command && s=0 && break || s=$?; done; (exit $s)

答え2

スクリプトはカウンタを使用してコマンドのn試行回数を5回に制限します。コマンドが成功すると、breakループは終了します。

n=0
until [ "$n" -ge 5 ]
do
   command && break  # substitute your command here
   n=$((n+1)) 
   sleep 15
done

答え3

function fail {
  echo $1 >&2
  exit 1
}

function retry {
  local n=1
  local max=5
  local delay=15
  while true; do
    "$@" && break || {
      if [[ $n -lt $max ]]; then
        ((n++))
        echo "Command failed. Attempt $n/$max:"
        sleep $delay;
      else
        fail "The command has failed after $n attempts."
      fi
    }
  done
}

例:

retry ping invalidserver

次の出力を生成します。

ping: unknown host invalidserver
Command failed. Attempt 2/5:
ping: unknown host invalidserver
Command failed. Attempt 3/5:
ping: unknown host invalidserver
Command failed. Attempt 4/5:
ping: unknown host invalidserver
Command failed. Attempt 5/5:
ping: unknown host invalidserver
The command 'ping invalidserver' failed after 5 attempts

複雑なコマンドを使用した実際の作業例については、次を参照してください。このスクリプト

答え4

再試行機能です

function retry()
{
        local n=0
        local try=$1
        local cmd="${@: 2}"
        [[ $# -le 1 ]] && {
        echo "Usage $0 <retry_number> <Command>"; }

        until [[ $n -ge $try ]]
        do
                $cmd && break || {
                        echo "Command Fail.."
                        ((n++))
                        echo "retry $n ::"
                        sleep 1;
                        }

        done
}

retry $*

出力:

[test@Nagios ~]$ ./retry.sh 3 ping -c1 localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.207 ms

--- localhost ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.207/0.207/0.207/0.000 ms

[test@Nagios ~]$ ./retry.sh 3 ping -c1 localhostlasjflasd
ping: unknown host localhostlasjflasd
Command Fail..
retry 1 ::
ping: unknown host localhostlasjflasd
Command Fail..
retry 2 ::
ping: unknown host localhostlasjflasd
Command Fail..
retry 3 ::

関連情報