修正する

修正する

Dummy.shデータをロードし、fix.sh問題のあるデータを修正してからデータをロードするユースケースがあります。回復スクリプトが3回の試行以内に問題を解決できない場合は、再試行ロジックを実装する必要があります。

ただし、あるスクリプトが無限ループで別のスクリプトを呼び出す再帰呼び出しが発生します。

誰でも私のエラーを指摘したり、他の解決策を提案したりできますか?

dummy.sh

#!/bin/bash -x
echo "Load data"
/home/user/etc/fix.sh

修正する

#!/bin/bash -x

TEMCOUNTER_TMP=FILE_NAME"_tmp6"

RETRY_C=0

echo $RETRY_C > $TEMCOUNTER_TMP

RETRY_LOGIC=`cat /home/user/etc/$TEMCOUNTER_TMP`
echo $RETRY_LOGIC

while [ $RETRY_LOGIC -le 3 ]
do
/home/user/etc/Dummy.sh
RETRY_LOGIC=`expr $RETRY_LOGIC + 1`
echo $RETRY_LOGIC > $TEMCOUNTER_TMP

done

オペレーティングシステム:SunOS 5.10 Generic_144488-06 sun4u sparc SUNW、Sun-Fire-V210

PS:呼び出し以外のDummy.shでは、いかなるロジックも実装できません。fix.sh

ベストアンサー1

これにはいくつかの問題があります。デフォルトでは、2つのループを繰り返します。 1つは内部fix.sh(whileループを使用)であり、コールバックを介して再び繰り返されますdummy.sh。また、最初からカウンタファイルをゼロにリセットするのでfix.sh計算されません。逆方向に注文することもできるので、dummy.shカウンタをインクリメントする前に(再帰)呼び出しが発生します。

再帰的な動作のみが必要であるとします(dummy.shを変更できるため)。

修正する

#!/bin/bash -x

TEMCOUNTER_TMP=/home/user/etc/FILE_NAME"_tmp6"

RETRY_LOGIC=`cat $TEMCOUNTER_TMP`
echo $RETRY_LOGIC

# Does RETRY_LOGIC have a value?
if [ -z "$RETRY_LOGIC" ]
then
    RETRY_LOGIC=0
    echo 0 > $TEMCOUNTER_TMP
fi

# Try to apply fix
[ $((RANDOM %3)) = 0 ]

# Did it work?
if [ $? = 0 ]
then
    echo "Success!"
    rm $TEMCOUNTER_TMP
    exit
fi

if [ $RETRY_LOGIC -le 3 ]
then
    export RETRY_LOGIC=`expr $RETRY_LOGIC + 1`
    echo $RETRY_LOGIC > $TEMCOUNTER_TMP
    echo "Retrying..."
    /home/user/etc/Dummy.sh
else
    echo "Giving up"
    rm $TEMCOUNTER_TMP
fi

また、パスをもう一度確認してください。TEMCOUNTER_TMP変数プレフィックスは1つの場所にのみ付けられました。/home/user/etc/

ご注意ください、exportこのコマンドは$RETRY_LOGIC後続の試行で使用できるため、変数が他の場所で使用されていない限り、参照されているすべての行を削除でき、TEMCOUNTER_TMP同じように機能します。もしあなたならするこのファイルは必須です。参考にしてください。後で掃除する方が良いかもしれません。

おすすめ記事