bash で コマンドが成功するまでリトライする

  • 9
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

ここにいろいろ載ってました。

http://stackoverflow.com/questions/12321469/retry-a-bash-command-with-timeout

回答1

NEXT_WAIT_TIME=0
COMMAND_STATUS=1
until [ $COMMAND_STATUS -eq 0 || $NEXT_WAIT_TIME -eq 4 ]; do
  command
  COMMAND_STATUS=$?
  sleep $NEXT_WAIT_TIME
  let NEXT_WAIT_TIME=NEXT_WAIT_TIME+1
done

リトライ間隔を0秒、1秒、2秒… と増やしながら実行する感じですね。
ただ、これだと、2回めで成功してもsleepしちゃうな、とか、最終的に全部失敗した際、無駄に最後にsleepだけして終了するな、とか気になりました。

回答2


NEXT_WAIT_TIME=0
until command || [ $NEXT_WAIT_TIME -eq 4 ]; do
   sleep $(( NEXT_WAIT_TIME++ ))
done

こっちの方がシンプルで良さそう。

あと、こんなのもあった。

その他

http://fahdshariff.blogspot.jp/2014/02/retrying-commands-in-shell-scripts.html

#!/bin/bash

# Retries a command on failure.
# $1 - the max number of attempts
# $2... - the command to run
retry() {
    local -r -i max_attempts="$1"; shift
    local -r cmd="$@"
    local -i attempt_num=1

    until $cmd
    do
        if (( attempt_num == max_attempts ))
        then
            echo "Attempt $attempt_num failed and there are no more attempts left!"
            return 1
        else
            echo "Attempt $attempt_num failed! Trying again in $attempt_num seconds..."
            sleep $(( attempt_num++ ))
        fi
    done
}

# example usage:
retry 5 ls -ltr foo

実際使うときには、timeout コマンドと組み合わせて、◯秒以内に終わらなかったら、再実行 みたいな感じかな。