
У меня есть вариант использования, где Dummy.sh
загружаются данные, fix.sh
исправляются проблемные данные и снова загружаются данные. Здесь мне нужно реализовать логику повтора, если скрипт исправления не может решить проблему с 3 попыток.
Но это происходит в рекурсивном вызове, когда один скрипт вызывает другой в бесконечном цикле.
Может ли кто-нибудь указать на мою ошибку или предложить другое решение?
Dummy.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
и это будет работать так же. Если выделатьнужен файл, обратите внимание, чтоловушкаможет быть, лучше потом его убрать.