consertar.sh

consertar.sh

Eu tenho um caso de uso em que Dummy.shcarrego dados e fix.shcorrijo dados problemáticos e carrego dados novamente. Aqui eu tenho que implementar a lógica de nova tentativa, se o script de correção não for capaz de resolver o problema em 3 tentativas.

Mas está acontecendo uma chamada recursiva, onde um script chama outro em loop infinito.

Alguém pode identificar meu erro ou sugerir alguma outra solução?

Manequim.sh

#!/bin/bash -x
echo "Load data"
/home/user/etc/fix.sh

consertar.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

SO: SunOS 5.10 Generic_144488-06 sun4u sparc SUNW,Sun-Fire-V210

PS: não consigo implementar nenhuma lógica em Dummy.sh além de chamarfix.sh

Responder1

Existem alguns problemas aqui. Principalmente, você itera dois loops, um interno fix.sh(com o loop while) e novamente recursivamente chamando de volta para dummy.sh. Além disso, você redefine o arquivo do contador para zero no início de fix.sh, portanto, ele nunca será capaz de fazer a contagem progressiva. Você também tem a ordem inversa, para que as chamadas (recursivas) dummy.shocorram antes de incrementar o contador.

Supondo que apenas o comportamento recursivo seja necessário (já que você pode alterar dummy.sh):

consertar.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

Além disso, verifique seus caminhos com cuidado, você prefixou a TEMCOUNTER_TMPvariável /home/user/etc/em apenas um local.

Observe que oexportO comando disponibiliza $RETRY_LOGICnas tentativas subsequentes, portanto, desde que essa variável não seja usada em outro lugar, você pode remover todas as linhas referentes TEMCOUNTER_TMPe funcionará da mesma forma. Se vocêfazerprecisar do arquivo, observe que umarmadilhatalvez seja melhor limpá-lo depois.

informação relacionada