Wie wiederholen Sie einen Befehl in der Bash?
Ich habe einen Befehl, dass sollten weniger als 1 minute ausgeführt, aber aus irgendeinem Grund hat eine extrem lange, eingebaute timeout-Mechanismus. Ich möchte einige bash, das das folgende tut:
success = False
try(my_command)
while(!(success))
wait 1 min
if my command not finished
retry(my_command)
else
success = True
end while
Wie kann ich das in Bash?
- was willst du mit dem laufen eine? es töten?
- Was bedeutet
retry
tun? Willst du es einfach nur beenden, den früheren versuchen, und erzeugen Sie einen neuen? - SO hat eine race-condition auf zu kommentieren, es scheint... 😉
- Nein, das war ein
retry
grins
Du musst angemeldet sein, um einen Kommentar abzugeben.
Blick auf die GNU
timeout
Befehl. Dieser tötet den Prozess, wenn es noch nicht abgeschlossen haben, in einer bestimmten Zeit; Sie würde einfach wickeln Sie eine Schleife, um diese zu warten, für dietimeout
erfolgreich abgeschlossen wird, mit Verzögerungen zwischen den Wiederholungen, wie die entsprechenden, etc.Wenn Sie es tun müssen, in reiner
bash
(das ist nicht wirklich machbar -bash
verwendet viele der anderen Befehle), dann werden Sie in eine Welt von Schmerz und frustration, die mit der signal-Handler und alle Arten von Fragen.-k 70
ist--kill-after=
70 Sekunden124
Ausfahrt auf timeout, was ist der60
?timeout [options] duration command [arg]...
; eine der Möglichkeiten ist-k duration
. Die-k duration
sagt: "wenn der Befehl nicht sterben, nach dem SIGTERM-signal gesendet wird, bei 60 Sekunden, senden Sie ein SIGKILL-signal bei 70 Sekunden" (und der Befehl sterben sollte, dann). Es gibt eine Reihe von dokumentierten exit-Status; 124 zeigt an, dass der Befehl Zeitüberschreitung; 137, dass er starb, nachdem er schickte das signal SIGKILL, und so weiter. Sie können nicht sagen, ob der eigentliche Befehl beendet sich mit einem der Status dokumentiert.SIGTERM
wird gesendet, nachdem die positions-arg-Dauer60
... sorry, ich sollte gesehen haben, dass. DankFand ich ein script aus:
http://fahdshariff.blogspot.com/2014/02/retrying-commands-in-shell-scripts.html
Können Sie einen Befehl ausführen und behalten die Kontrolle mit der
&
hintergrund operator. Führen Sie den Befehl in den hintergrundsleep
so lange, wie Sie wollen, im Vordergrund, und dann, wenn der hintergrund-job noch nicht beendet, töten Sie es und starten Sie über.kill -9
es sei denn, Sie haben wirklich zu. partmaps.org/era/unix/award.html#killkill -9
wenn dies notwendig ist". Leider ist die partmaps.org web-site zu sein scheint AWOL jetzt (aber die Wayback Machine hat es verfügbar als web.archive.org/web/20140123014909/http://partmaps.org/era/unix/...).Anpassung @Shins Antwort zu verwenden
kill -0
eher alsjobs
so, dass dies funktionieren sollte, auch mit klassischen Bourne-shell, und damit für andere hintergrund-jobs. Sie haben zu Experimentieren mitkill
undwait
je nachdem, wiemy_command
reagiert auf diese.Ich mochte @Jonathan ' s Antwort, versuchte aber, um es noch einfacher für die zukünftige Verwendung:
Mithilfe der "retrycli" - tool können Sie bekommen exponential backoff und Wiederholungen auf jedem bash-Skript oder tool (nicht bash-Funktionen, obwohl, es sei denn, Sie wurden verschoben in einem anderen Skript was dann aufgerufen, durch wiederholen).
retrycli