Ich möchte eine Logik in ein Shell-Skript schreiben, das versucht, es nach 15 Sekunden bis zu 5 Mal erneut auszuführen, basierend auf "status code = FAIL", wenn es aufgrund eines Problems fehlschlägt.
shell-script
Sandeep Singh
quelle
quelle
break
wenn der Befehl erfolgreich ist, dann wird er die Schleifeif command; then break; fi
oder genauercommand && break
n
Ausfällen wird vor dem Beenden unnötigerweise ein weiteres Mal geschlafen.Ersetzen Sie "command" durch Ihren Befehl. Dies setzt voraus, dass "Statuscode = FAIL" einen beliebigen Rückkehrcode ungleich Null bedeutet.
Variationen:
Verwenden der
{..}
Syntax. Funktioniert in den meisten Shells, aber nicht in BusyBoxsh
:Verwendung
seq
und Weitergabe entlang der Beendigungscode des ausgefallenen Befehl:Wie oben, aber
sleep 15
nach dem endgültigen Fehlschlag überspringen . Da es besser ist, die maximale Anzahl von Schleifen nur einmal zu definieren, wird dies erreicht, indem am Anfang der Schleife geschlafen wird, wenni > 1
:quelle
for i in 1 2 3 4 5
mit ,for i in {1..5}
weil es leichter zu pflegen.&&
vor dem ausgewertet wird||
wegen Operatorpräzedenzcommand
fehlschlägt.[[ i -eq 5]]
vor dem Schlafengehen eine OP- Prüfung durchführen , um dies zu vermeiden.Beispiel:
erzeugt diese Ausgabe:
Ein reales Beispiel für die Arbeit mit komplexen Befehlen finden Sie in diesem Skript .
quelle
Hier ist die Funktion für einen erneuten Versuch
Ausgabe :
quelle
bash retry.sh 3 ping -c1 localhost
GNU Parallel hat
--retries
:quelle
Hier ist mein Lieblings-Alias / Skript für eine Zeile
Dann kannst du Sachen machen wie:
und es wird den vorherigen Befehl so lange ausführen, bis es "Nächster Prozess" findet
quelle
fc -e "#"
anstelle vonfc -s
.Ich verwende dieses Skript, das die Wiederholungen eines bestimmten Befehls durchführt. Der Vorteil dieses Skripts besteht darin, dass der Exit-Code erhalten bleibt, wenn alle Wiederholungen fehlschlagen.
Wahrscheinlich kann es einfacher werden
quelle
Siehe unten Beispiel:
Ich versuche, Port 3389 auf localhost zu verbinden. Der Versuch wird wiederholt, bis fünfmal ein Fehler auftritt. Bei Erfolg wird die Schleife unterbrochen.
$?
Der Status des Befehls ist vorhanden, wenn Null bedeutet, dass der Befehl erfolgreich ausgeführt wurde. Wenn nicht Null, bedeutet dies, dass der Befehl fai ausgeführt wurdeScheint ein bisschen kompliziert, kann jemand es besser machen.
quelle
$?
es ist Status des Befehls gegeben , wenn es Null bedeutet , erfolgreich Befehl ausführen, wenn andere als Null bedeutet Befehl fehlSie können den hier
loop
verfügbaren Befehl folgendermaßen verwenden :Das macht dein Ding alle 15 Sekunden, bis es erfolgreich ist, maximal fünf Mal.
quelle
Hier ist eine rekursive
retry
Funktion für Puristen der funktionalen Programmierung:Übergeben Sie einen Befehl (oder einen Funktionsnamen) und optional eine Anzahl von Wiederholungen und eine Ruhezeit zwischen den Wiederholungen, wie folgt:
quelle