LoginSignup
11

More than 5 years have passed since last update.

シェルスクリプトでリトライ処理を追加する

Posted at

他の人が作った既存のシェルスクリプト(bash)がたまに実行失敗していて、突貫でリトライ処理を追加したのでメモ。

retry() {
   MAX_RETRY=5
   n=0
   until [ $n -ge $MAX_RETRY ]
   do
      "$@" && break
      n=$[$n+1]
      sleep $[ ( $RANDOM % 15 )  + 1 ]s
   done
   if [ $n -ge $MAX_RETRY ]; then
     echo "failed: ${@}" >&2
     exit 1
   fi
}

HOSTEDZONE_ID=`retry /usr/bin/aws route53 list-hosted-zones-by-name --dns-name example --max-items 1 --query 'HostedZones[].Id[]' --output text --region ap-northeast-1`

retry /usr/bin/aws route53 change-resource-record-sets --hosted-zone-id ${HOSTEDZONE_ID} --change-batch "${BATCH_JSON}" --region ap-northeast-1

やり方としては、retry関数を定義して、再実行処理を入れたいコマンドの先頭にretryを追加するだけ。

上記はランダム時間(最大15秒)待って再実行し、最大5回実行して停止する場合。コマンドの先頭にretryを追加するだけなので見通しも悪くならないはず。

ちなみに開発環境で使うだけなので大した動作確認はしていません。

注意点として、一つ目のコマンドのように標準出力を受け取りたいときに、失敗時にも標準出力に出力されてしまう場合には、うまくいかないと思われる。

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
11