ksaitoの日記

日々試したことの覚え書き

bashのretry

下記のコードを$HOME/.bashrcに追加するとコマンドが失敗した場合に、一定時間待って、指定した回数リトライするretry関数を追加できます。

オリジナルは、ここのソースを参考に改良しました。(コメントしようと思いましたが、50以上の評価がないとコメントできませんでした。)

aws cliでリソースを作成した場合、awsコマンドは、リソース作成の終了を待たずに終わってしまいます。リソース作成が終わってから後続の処理をしたい場合に、適切なタイムアウトを設けてリトライするのに便利です。

コード

function retry() {
    if [ $# -lt 3 ]; then
        echo 'usage: retry <num retries> <wait retry secs> "<command>"'
        return 1
    fi

    retries=$1
    wait_retry=$2
    shift 2
    command=$@

    for i in `seq 1 $retries`; do
        echo "$command"
        $command
        ret_value=$?
        [ $ret_value -eq 0 ] && break
        echo "> failed with $ret_value, $wait_retry sec waiting to retry..."
        sleep $wait_retry
    done

    return $ret_value
}

使い方

成功する場合

$ retry 5 1 test 0 -eq 0
test 0 -eq 0
$ echo $?
0
$ 

失敗する場合

$ retry 5 1 test 0 -eq 1
test 0 -eq 1
> failed with 1, 1 sec waiting to retry...
test 0 -eq 1
> failed with 1, 1 sec waiting to retry...
test 0 -eq 1
> failed with 1, 1 sec waiting to retry...
test 0 -eq 1
> failed with 1, 1 sec waiting to retry...
test 0 -eq 1
> failed with 1, 1 sec waiting to retry...
$ echo $?
1
$