
Tengo un caso de uso en el que Dummy.sh
cargar datos, fix.sh
corregir 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.sh
ocurrir 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_TMP
variable /home/user/etc/
en una sola ubicación.
Tenga en cuenta que elexport
El comando hace que $RETRY_LOGIC
esté 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.