2016-05-23 5 views
0

Ich habe ein Bash-Skript, das ein Programm ausführt, um einige Daten zu migrieren. Dies schlägt ungefähr 30-40% der Zeit fehl.Einen spezifischen Fehler abfangen und Script erneut versuchen? - BASH

Ich möchte eine Möglichkeit, das Skript erneut zu versuchen, wenn dieser bestimmte Fehler auftritt, aber ich möchte nur 3 mal versuchen, bevor es scheitert.

Das Skript gibt die folgenden, wenn es fehlschlägt:

Error: The connection to the remote server has timed out, no changes  have been committed. (#134 - scope: ajax_verify_connection_to_remote_site) 

Edit: Um genauer zu sein ....

migration.sh: 
#!/bin/bash 
various other scripts........ 
sudo a_broken_migration_program <Variables> 

ich broken_migration wollen mehrmals wiederholen, idealerweise nur dann, wenn es scheitert mit diesem spezifischen Fehler, aber wenn das zu kompliziert ist, werde ich mich damit begnügen, alle Fehler erneut zu versuchen.

+1

In meinem Kopf würde ich vorschlagen, dass Sie Ihre Haupt-Migrationslogik in eine Bash-Funktion in Ihrem Skript einfügen. Die Funktion kann den Beendigungscode des tatsächlichen Migrationsprozesses zurückgeben, und Sie können eine einfache Schleife mit einem Limit von 3 erstellen, um den Aufruf der Funktion zu wiederholen. – Lix

+1

"Wiederholen ... wenn dieser spezielle Fehler auftritt". Sie sind also glücklich, weiterzumachen, wenn andere Fehler auftreten? Kennen Sie den Rückkehrcode der Shells, der in '$?' Gespeichert ist, ist er 0, wenn er OK ist, und eine Zahl ungleich null, wenn irgendein Fehler aufgetreten ist. Alle guten Befehle sollten diese Konvention einhalten. Wie es ist, ist dieses Q zu Brett, und viele werden stimmen, um zu schließen. Wir müssen einen Code sehen, der das Problem spezifischer und testbarer macht. Viel Glück. – shellter

+0

@shellter: Ich möchte mit allen Fehlern aufhören, außer diesem speziellen Fehler, der sehr häufig ist. Aus irgendeinem Grund schlägt dieses Migrationstool ziemlich oft fehl, aber im zweiten oder dritten Durchlauf wird es perfekt abgeschlossen. Als zu breit zu sein, ich weiß nicht, wie ich genauer sein kann ..... Ich habe ein Programm aus einem Shell-Skript ausgeführt. Ich möchte diesen spezifischen Fehler abfangen und es erneut versuchen. Ich werde meinen Beitrag aktualisieren, um es klarer zu machen .... – James

Antwort

2

Um dies zu tun, führen Sie einfach Ihren Befehl in einer Schleife:

#Loop until counter is 3 
counter=1 
while [[ $counter -le 3 ]] ; do 
     yourcommand && break 
     ((counter++)) 
done 

Wenn yourcommand erfolgreich ist, dann wird es die Schleife brechen. Wenn es nicht erfolgreich ist, erhöht es den Zähler und die Schleife. Bis der Zähler 3.

ist, wenn Sie nur auf einem bestimmten Fehlercode erneut zu versuchen möchten, können Sie den Fehler bei einem Fehler erfassen, testen Sie den Code, und Schritt:

#Loop until counter is 3 
counter=1 
while [[ $counter -le 3 ]] 
do 
     #command to run 
     ssh [email protected] 

     rc=$? 
     [[ $rc -eq 255 ]] && ((counter++)) || break 
done 

Dieses Beispiel zu ssh versucht, eine Box, die nicht existiert. Wir erfassen dann den Rückgabecode $? in der Variablen $rc. Wenn $rc255 ist ("ssh: Hostname comphatdoesntexist konnte nicht aufgelöst werden: Name oder Dienst nicht bekannt"), werden der Zähler und die Schleifen inkrementiert. Jeder andere Exit-Code bringt uns aus der Schleife.

+0

Awesome Ich denke, das ist genau das, was ich brauchte. Ich habe das erste Snippet ausprobiert und es funktioniert ganz gut, jetzt muss ich nur den Fehler abfangen und herausfinden, was der Fehlercode ist und ich sollte alles einstellen! Hoffentlich hat der Entwickler verschiedene Codes für verschiedene Fehler verwendet. Sonst muss ich zu deinem ersten Snippet zurückfallen, aber ich denke, ich kann mit allen Versuchen weitermachen, wenn es nicht möglich ist. Danke noch einmal. – James