2016-07-20 7 views
1

Ich suche nach einer Lösung, um ein Bash-Skript in einem definierten Schritt neu zu starten, wenn es zuvor fehlgeschlagen ist.Bash - Fehlerkorrektur durch Schritte

Zum Beispiel habe ich ein Bash-Skript:

#my_script.sh: 

    #Step 1 
    Action 1 

    #Step 2 
    Action 2 

    #Step 3 
    Action 3 

    #Step 4 
    Action 4 

Nachdem es am step 3 ausfällt, ich möchte in der Lage sein, es zu nennen diese Art und Weise:

./my_script.sh step3

es also wird bei step 3 beginnen und die Schritte first 2 nicht wiederholen.

Irgendwelche Ideen? Danke

+0

Ihr Leben und das Leben Ihrer Mitarbeiter einfacher und betrachten eine * real * Programmiersprache zu verwenden. – hek2mgl

+0

@ hek2mgl Es gibt nicht genug Details, um zu wissen, ob Shell die falsche Sprache ist. Wenn die Aktionen nur andere Probleme ausführen, ist Shell sicherlich eine gute Wahl. – chepner

+0

@echepner Eigentlich hast du recht, ich habe das selbst gedacht - nachdem ich es gepostet habe. ;) Aber dann habe ich es verpasst es zu löschen. Dennoch würde ich sagen, dass die Shell, egal wie gerne wir damit spielen, einfach das falsche Werkzeug für die Anwendungsentwicklung ist. Es ist ok für wirklich begrenzte Aufgaben. Im Falle von Komplexität begrenzt. Es wird fast immer unordentlich, wenn sich die anfänglichen Aufgaben im Laufe der Zeit ändern.Wahrscheinlich der richtige Kommentar unter der falschen Frage. – hek2mgl

Antwort

0

Sie könnten Ihren Code so schreiben, dass Sie den Schritt eingeben, von dem aus er beginnen soll: ./my_script.sh 3. Dann in Ihren Code können Sie eine case-Anweisung verwenden, die als "Eingabe" $1 nimmt, die Ihr Schritt als Eingabe angegeben ist. Ich werde den Code nicht für Sie schreiben, aber wenn Sie weitere Hilfe benötigen, posten Sie Ihre Lösung und ich bin froh, Ihnen einige Hinweise zu geben.

3

Ich gehe davon aus, dass wenn Schritt 2 fehlschlägt, möchten Sie von dort neu starten, und dieser Schritt N ist abhängig von den vorherigen Schritten 1 .. N-1.

Eine Möglichkeit, dies zu lösen, wäre Stempel Dateien zu erstellen, während Sie Ihr Skript ausführen.

einfach touch step1-stamp, wenn Sie mit Schritt fertig sind 1, touch step2-stamp, wenn Sie mit Schritt 2 fertig sind, usw.

Jeder Schritt würde prüfen, ob der Stempel für diesen Schritt vor besteht seine Aufgabe zu tun, zum Beispiel für N Schritt:

if [ ! -f "stepN-stamp" ]; then 
    # do tasks for step N 
    touch stepN-stamp 
fi 

ein ähnlicher Ansatz mit einem Makefile:

.PHONY: all clean 

all: step3-stamp 

step1-stamp: 
    @echo "Performing step 1" 
    @touch step1-stamp 

step2-stamp: step1-stamp 
    @echo "Performing step 2" 
    @touch step2-stamp 

step3-stamp: step2-stamp 
    @echo "Performing step 3" 
    @touch step3-stamp 

clean: 
    rm -f step[123]-stamp 

Hinweis: Dies ist alles unter der Annahme, dass Sie don‘ Ich möchte zufällige Schritte ausführen. Was Sie könnte tun, ist eine oder mehrere Stempeldateien zu entfernen und den gesamten Prozess von Anfang an erneut auszuführen. Vor allem die Makefile-Lösung wird dies problemlos handhaben, da sie die erneute Ausführung abhängiger Schritte erzwingt.

+0

Sehr schöne Idee! Ich würde auch empfehlen, den Stempel in Schritt N-1 zu löschen, sobald der in Schritt N erstellt wurde. – mik1904

+0

@ mik1904 Nein. Sie würden die Stempel nur löschen, wenn alles fertig ist. Wenn die Shell-Skript-Lösung den Stempel "N-1" löscht, wenn "N" erledigt ist, werden die "N-1" -Tasks erneut ausgeführt, wenn das Skript erneut ausgeführt wird. Mit der Makefile-Lösung würde das Löschen des Stempels "N-1", wenn "N" erfolgt, der "N-1" -Schritt und alle nachfolgenden Schritte (dh jeder Schritt, der vom Schritt "N-1" abhängt) erneut ausgeführt werden rennender 'make'. – Kusalananda

+1

Ich sehe, denn jedes Mal, wenn Sie das Skript ausführen, überprüfen Sie jeden Stempel und wenn es existiert, gehen Sie weiter. Sie geben also den Schritt nicht als Eingabe, da alles automatisch abläuft. Entschuldigung, jetzt verstehe ich. Sehr gut. – mik1904

1

bash 4 eingeführt Fall-through Verhalten in seiner case Erklärung mit der ;& Terminator.

# Contents of script 
case ${1:-step1} in 
    step1) echo "Running step 1" ;& 
    step2) echo "Running step 2" ;& 
    step3) echo "Running step 3" ;& 
    step4) echo "Running step 4" ;& 
    step5) echo "Running step 5" ;; 
    *) echo "Unrecognized starting point: $1"; exit 1 ;; 
esac 

Wenn Sie dieses Skript:

$ bash script step3 
Running step 3 
Running step 4 
Running step 5