2013年2月18日月曜日

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

スズキです。

下記のように作ってみました。("sub.sh"がリトライ対象です)
# cat test.sh 
#/bin/sh
trap 'echo "NG: $?"' ERR
set -e
# ...

RETRY_COUNT=5
RETRY_INTERVAL=1
set +e
COUNT=0
while true; do
    /root/sub.sh
    if [ $? -eq 0 ]; then
        break
    fi
    if [ $COUNT -eq $RETRY_COUNT ]; then
        echo "Timeout!" >&2
        exit 1
    fi
    COUNT=`expr $COUNT + 1`
    sleep $RETRY_INTERVAL
done

set -e
# ...
exit 0

呼び出しているスクリプトを下記のよう(正常終了)にすると、
# cat sub.sh 
#!/bin/sh
echo test
exit 0
すぐに(正常)終了します。
# ./test.sh 
test

逆に下記のように(異常終了)にすると、
# cat sub.sh 
#!/bin/sh
echo test
exit 1
指定時間(RETRY_INTERVAL:1秒)のインターバルをおいて、
指定回数(RETRY_COUNT:5回)のリトライ後、タイムアウトで(異常)終了します。
# ./test.sh 
test
NG: 1
test
NG: 1
test
NG: 1
test
NG: 1
test
NG: 1
test
NG: 1
Timeout!

これで、毎回ググらなくてもいいかも。
--------
http://www.suz-lab.com

0 コメント: