2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

シェルスクリプトでリトライ処理

Last updated at Posted at 2021-02-15

リトライ処理とは

常に成功するとは限らない処理に対して、時間間隔を開けてもう一度同じ処理を実行する試み。時間をずらせば、成功する可能性がある処理について行われる。

リトライ処理が必要とされる例としては次の通り。

  • なんらかのAPIが、時間単位でのリクエスト数の制限を掛けているとき
  • リソース不足で処理が中断される場合があるが、リソース不足をリクエスト元から観測できないとき

実際の利用事例

  • BigQuery の bq load を並列処理させていたが、 RateLimited にひっかかるので時間をおいてリトライしたい
  • スクレイピングのコードを動かしていたがネットワークが安定しないため、成功する場合と失敗する場合があったため、成功するまでリトライしたい

コード

コンソールが色制御に対応していれば、

# !/bin/sh
set -eu

ESC=$(printf '\033')
TAB=$(printf '\011')
RED="${ESC}[31m"
GREEN="${ESC}[32m"
YELLOW="${ESC}[33m"
NORMAL="${ESC}[0m"

retryable() {
    (
        i=0 MAX_RETRY=10
        COMMAND="$@"
        while [ $((i+=1)) -le $MAX_RETRY ]; do
            eval "$COMMAND" && printf "[${GREEN}success${NORMAL} $i/$MAX_RETRY]${TAB}$COMMAND\n" && break
            printf "[${RED}retry${NORMAL} $i/$MAX_RETRY]${TAB}$COMMAND\n"
            sleep 1
        done
        return $?
    )
}

# 使い方(retryable の後ろにコマンドを書く)
retryable printf "hello world"

表示例

スクリーンショット 2021-02-15 16.24.06.png

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?