修復程式

修復程式

我有一個用例,其中Dummy.sh加載數據並fix.sh修復有問題的數據,然後再次加載數據。如果修復腳本在 3 次嘗試中無法解決問題,我必須實作重試邏輯。

但它進入遞歸調用,其中一個腳本在無限循環中調用另一個腳本。

有人可以指出我的錯誤或建議任何其他解決方案嗎?

假人.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

這裡有幾個問題。主要是,您迭代兩個循環,一個在內部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為變數添加了前綴。/home/user/etc/

請注意,export命令$RETRY_LOGIC在後續嘗試中可用,因此只要變數不在其他地方使用,您就可以刪除引用的所有行TEMCOUNTER_TMP並且它的工作方式相同。如果你需要該文件,請注意陷阱之後清理可能會更好。

相關內容