fix.sh

fix.sh

Ich habe einen Anwendungsfall, bei dem Dummy.shich Daten lade, fix.shproblematische 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.shbevor 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_TMPVariable /home/user/etc/nur an einer Stelle ein Präfix vorangestellt.

Notiere dass derexportBefehl macht $RETRY_LOGICin den nachfolgenden Versuchen verfügbar, so dass, solange diese Variable nicht anderswo verwendet wird, Sie alle Zeilen entfernen können, die auf verweisen, TEMCOUNTER_TMPund es wird genauso funktionieren. Wenn SieTunWenn Sie die Datei benötigen, beachten Sie, dass einefangenvielleicht wäre es besser, es anschließend zu reinigen.

verwandte Informationen