
Eu tenho um caso de uso em que Dummy.sh
carrego dados e fix.sh
corrijo 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.sh
ocorram 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_TMP
variável /home/user/etc/
em apenas um local.
Observe que oexport
O comando disponibiliza $RETRY_LOGIC
nas tentativas subsequentes, portanto, desde que essa variável não seja usada em outro lugar, você pode remover todas as linhas referentes TEMCOUNTER_TMP
e funcionará da mesma forma. Se vocêfazerprecisar do arquivo, observe que umarmadilhatalvez seja melhor limpá-lo depois.