
Ich habe einen Anwendungsfall, bei dem Dummy.sh
ich Daten lade, fix.sh
problematische Daten behebe und die Daten erneut lade. Hier muss ich eine Wiederholungslogik implementieren, wenn das Behebungsskript das Problem im dritten Versuch nicht lösen kann.
Es handelt sich jedoch um einen rekursiven Aufruf, bei dem ein Skript ein anderes in einer Endlosschleife aufruft.
Kann jemand bitte meinen Fehler genau bestimmen oder eine andere Lösung vorschlagen?
Dummy.sh
#!/bin/bash -x
echo "Load data"
/home/user/etc/fix.sh
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
Betriebssystem: SunOS 5.10 Generic_144488-06 sun4u sparc SUNW,Sun-Fire-V210
PS: Ich kann in Dummy.sh keine andere Logik implementieren als den Aufruffix.sh
Antwort1
Hier gibt es ein paar Probleme. Hauptsächlich iterieren Sie zwei Schleifen, eine innerhalb fix.sh
(mit der while-Schleife) und noch einmal rekursiv, indem Sie zurück zu aufrufen dummy.sh
. Außerdem setzen Sie die Zählerdatei zu Beginn von auf Null zurück fix.sh
, sodass sie nie hochzählen kann. Sie haben auch die Reihenfolge umgekehrt, sodass die (rekursiven) Aufrufe erfolgen, dummy.sh
bevor Sie den Zähler erhöhen.
Angenommen, nur das rekursive Verhalten ist erforderlich (da Sie dummy.sh ändern können):
fix.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
Überprüfen Sie außerdem Ihre Pfade sorgfältig, Sie haben der TEMCOUNTER_TMP
Variable /home/user/etc/
nur an einer Stelle ein Präfix vorangestellt.
Notiere dass derexport
Befehl macht $RETRY_LOGIC
in den nachfolgenden Versuchen verfügbar, so dass, solange diese Variable nicht anderswo verwendet wird, Sie alle Zeilen entfernen können, die auf verweisen, TEMCOUNTER_TMP
und es wird genauso funktionieren. Wenn SieTunWenn Sie die Datei benötigen, beachten Sie, dass einefangenvielleicht wäre es besser, es anschließend zu reinigen.