修复程序

修复程序

我有一个用例,其中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并且它的工作方式相同。如果你需要该文件,请注意陷阱之后清理可能会更好。

相关内容