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