arreglar.sh

arreglar.sh

Tengo un caso de uso en el que Dummy.shcargar datos, fix.shcorregir datos problemáticos y cargar datos nuevamente. Aquí tengo que implementar la lógica de reintento, si el script de reparación no puede resolver el problema en 3 intentos.

Pero se realiza una llamada recursiva donde un script llama a otro en un bucle infinito.

¿Alguien puede señalar mi error o sugerir alguna otra solución?

tonto.sh

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

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

PD: no puedo implementar ninguna lógica en Dummy.sh aparte de llamarfix.sh

Respuesta1

Hay un par de problemas aquí. Principalmente, itera dos bucles, uno dentro fix.sh(con el bucle while) y nuevamente de forma recursiva llamando de nuevo a dummy.sh. Además, restablece el archivo del contador a cero al comienzo de fix.sh, por lo que nunca podrá contar. También tiene el orden al revés, por lo que las llamadas (recursivas) deben dummy.shocurrir antes de incrementar el contador.

Suponiendo que solo se requiere el comportamiento recursivo (ya que puede cambiar dummy.sh):

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

Además, revise sus rutas cuidadosamente, le puso el prefijo a la TEMCOUNTER_TMPvariable /home/user/etc/en una sola ubicación.

Tenga en cuenta que elexportEl comando hace que $RETRY_LOGICesté disponible en los intentos posteriores, por lo que siempre que esa variable no se use en ningún otro lugar, puede eliminar todas las líneas que hacen referencia aTEMCOUNTER_TMP y funcionará igual. Si ustedhacernecesita el archivo, tenga en cuenta quetrampaQuizás sería mejor limpiarlo después.

información relacionada