
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
も同じように動作します。するファイルが必要な場合は、トラップ後で掃除した方が良いかもしれません。