Beenden einer Endlosschleife

Beenden einer Endlosschleife

Ich habe einen Befehl, den ich nach jeder Beendigung automatisch erneut ausführen lassen möchte. Deshalb habe ich so etwas ausgeführt:

while [ 1 ]; do COMMAND; done;

Ctrl-caber wenn ich die Schleife nicht mit „as“ stoppen kann, wird sie einfach beendet COMMANDund nicht die gesamte Schleife.

Wie kann ich etwas Ähnliches erreichen, das ich jedoch stoppen kann, ohne das Terminal schließen zu müssen?

Antwort1

Sie können Ihren Job während der Ausführung mit ctrl+ stoppen und in den Hintergrund stellen z. Anschließend können Sie Ihren Job mit folgendem Befehl beenden:

$ kill %1

Wobei [1] Ihre Jobnummer ist.

Antwort2

Überprüfen Sie den Beendigungsstatus des Befehls. Wenn der Befehl durch ein Signal beendet wurde, lautet der Beendigungscode 128 + die Signalnummer. Aus demGNU-Onlinedokumentation für Bash:

Für die Zwecke der Shell war ein Befehl erfolgreich, der mit einem Exit-Status von Null beendet wird. Ein Exit-Status ungleich Null zeigt einen Fehler an. Dieses scheinbar kontraintuitive Schema wird verwendet, damit es eine klar definierte Möglichkeit gibt, Erfolg anzuzeigen, und eine Vielzahl von Möglichkeiten, verschiedene Fehlermodi anzuzeigen. Wenn ein Befehl mit einem fatalen Signal mit der Nummer N beendet wird, verwendet Bash den Wert 128+N als Exit-Status.

POSIX gibt außerdem an,dass der Wert eines Befehls, der durch ein Signal beendet wurde, größer als 128 ist, aber seinen genauen Wert nicht so anzugeben scheint, wie es GNU tut:

Der Beendigungsstatus eines Befehls, der aufgrund des Empfangs eines Signals beendet wurde, soll als größer als 128 gemeldet werden.

Wenn Sie beispielsweise einen Befehl mit Strg-C unterbrechen, lautet der Exit-Code 130, da SIGINT auf Unix-Systemen Signal 2 ist. Also:

while [ 1 ]; do COMMAND; test $? -gt 128 && break; done

Antwort3

Ich würde sagen, es wäre am besten, die Endlosschleife in ein Skript zu packen und die Signale dort zu verarbeiten. Hier ist eingrundlegender Ausgangspunkt. Ich bin sicher, Sie möchten es entsprechend ändern. Das Skript fängt trap- ctrl( coder SIGTERM) ab, beendet den Befehl (ich habe es sleephier als Test verwendet) und wird beendet.

cleanup ()
{
kill -s SIGTERM $!
exit 0
}

trap cleanup SIGINT SIGTERM

while [ 1 ]
do
    sleep 60 &
    wait $!
done

Antwort4

Wenn Sie Bash mit ausführen, -ewird es bei allen Fehlerbedingungen beendet:

#!/bin/bash -e
false # returns 1
echo This won't be printed

verwandte Informationen