исправить.ш

исправить.ш

У меня есть вариант использования, где 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и это будет работать так же. Если выделатьнужен файл, обратите внимание, чтоловушкаможет быть, лучше потом его убрать.

Связанный контент