他の人が作った既存のシェルスクリプト(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を追加するだけなので見通しも悪くならないはず。
ちなみに開発環境で使うだけなので大した動作確認はしていません。
注意点として、一つ目のコマンドのように標準出力を受け取りたいときに、失敗時にも標準出力に出力されてしまう場合には、うまくいかないと思われる。