修正

修正

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

しかし、これは再帰呼び出しで、1 つのスクリプトが別のスクリプトを無限ループで呼び出します。

誰か私の間違いを指摘してもらえますか、または他の解決策を提案してもらえますか?

ダミー

#!/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

OS: SunOS 5.10 Generic_144488-06 sun4u sparc SUNW、Sun-Fire-V210

PS: Dummy.shでは、呼び出し以外のロジックを実装することはできません。fix.sh

答え1

ここで問題がいくつかあります。主に、2 つのループを繰り返します。1 つは内部fix.sh(while ループを使用) で、もう 1 つは を呼び出して再帰的に行います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変数の先頭に を付けたのは/home/user/etc/1 か所だけです。

注意:exportコマンドは$RETRY_LOGIC後続の試行で利用可能になるので、その変数が他の場所で使用されていない限り、参照するすべての行を削除してTEMCOUNTER_TMPも同じように動作します。するファイルが必要な場合は、トラップ後で掃除した方が良いかもしれません。

関連情報