Frage Bash-Skript: Befehl wiederholen, wenn ein Fehler zurückgegeben wird


Ich möchte eine Schleife erstellen, die eine ncftp-Übertragung wiederholt, wenn sie einen Fehler zurückgibt.

Ich bin ein wenig unsicher, wie die Exit-Code-Variable in einer Schleife verwendet werden kann. Würde so etwas funktionieren?

until [$? == 0]; do
    ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file
done

21
2017-11-03 09:05


Ursprung


Verbunden: wie man den "curl" -Befehl automatisch wiederholt, wenn der Fehler auftritt - hakre


Antworten:


Ich fand die Basis für diese elegante Schleife anderswo auf Serverfault. Es stellt sich heraus, dass der Exit-Code nicht gespeichert werden muss, da Sie direkt den Befehl selbst testen können.

until ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file; do
  echo Tansfer disrupted, retrying in 10 seconds...
  sleep 10
done

33
2017-11-03 11:15





Fast. Sie sollten den Rückgabewert wahrscheinlich besser als Variable speichern, damit Sie ihn vor der Schleife festlegen können. Sonst wird es durch den zuletzt ausgeführten Befehl beeinflusst.

Vielleicht möchten Sie auch einen sleep dort zu stoppen, damit es zu schnell wieder auftaucht.

RET=1
until [ ${RET} -eq 0 ]; do
    ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file
    RET=$?
    sleep 10
done

8
2017-11-03 09:10



Ich denke, vergessen, den Exit-Code an die Variable RET zu übergeben, aber ich habe die Idee. Meine Hauptfrage ist wann wird die Klausel bis ausgewertet? In C wird es erst nach dem ersten Durchlauf der Schleife ausgewertet, in diesem Fall sollte meine Schleife funktionieren. Deines ist jedoch immer noch besser, da es Zwischenbefehle wie den Schlaf erlaubt. Vielen Dank! - Roy
Gut beobachtet. Ich habe es bearbeitet. Die Klausel wird vor dem ersten Lauf ausgewertet. Daher würde es zuvor den Rückkehrcode eines vorhergehenden Befehls verwenden. Die Double-Equals werden nicht von Bash erzwungen, aber es ist eine gute Übung, sie zu verwenden. - Dan Carley
== ist für Stringgleichheit nicht numerisch, obwohl ich denke, dass es in diesem Fall keine Rolle spielt ... - Kyle Brandt♦
Einzel- und Doppelgleich sind gleich. Aber es wäre besser, die Ganzzahlgleichheit jetzt zu verwenden, wenn Sie es erwähnen. - Dan Carley
Sie müssen die Return-Code-Nummer nicht testen - Sie können nur den Return-Code des Programms selbst testen - bis zum Programm; Schlaf 3; erledigt . - chris


Bit-Hacky, aber meine Lösung war, nur eine Bash-Funktion zu erstellen, die sich selbst ausführt, wenn sie mit einem Fehler beendet wird

function retry { the_command_you_want && echo "success" || (echo "fail" && retry) }; retry

2
2018-03-17 03:55





Sie können eine Schleife ausführen, während der Befehl einen Fehler zurückgibt:

    while [ -n $(ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file) ]; do
            sleep 1;
    done;

0
2017-12-09 21:01



Diese Antwort braucht eine Erklärung. - kasperd
@ Kasperd Erklärung hinzugefügt - Andrés Rivas