Ich habe einen Befehl, den ich jedes Mal, wenn er beendet wird, automatisch erneut ausführen lassen möchte. Daher habe ich Folgendes ausgeführt:
while [ 1 ]; do COMMAND; done;
aber wenn ich die Schleife nicht stoppen kann Ctrl-c, tötet das einfach COMMAND
und nicht die gesamte Schleife.
Wie würde ich etwas Ähnliches erreichen, das ich aber beenden kann, ohne das Terminal schließen zu müssen?
Antworten:
Überprüfen Sie den Beendigungsstatus des Befehls. Wenn der Befehl durch ein Signal beendet wurde, ist der Beendigungscode 128 + die Signalnummer. Aus der GNU Online-Dokumentation für Bash :
POSIX gibt auch an, dass der Wert eines Befehls, der durch ein Signal beendet wird, größer als 128 ist, aber den genauen Wert nicht wie GNU anzugeben scheint:
Wenn Sie zum Beispiel einen Befehl mit Control-C unterbrechen, lautet der Exit-Code 130, da SIGINT auf Unix-Systemen Signal 2 ist. Damit:
quelle
paplay alert.ogg
, vielleicht behandelt dapaplay
das Signal?Sie können den Job anhalten und mit ctrl+ in den Hintergrund stellen, während er ausgeführt wird z. Dann können Sie Ihren Job töten mit:
Wobei [1] Ihre Auftragsnummer ist.
quelle
Ich würde sagen, es ist am besten, wenn Sie Ihre Endlosschleife in ein Skript einfügen und dort mit Signalen umgehen. Hier ist ein grundlegender Ausgangspunkt . Ich bin sicher, dass Sie es an Ihre Bedürfnisse anpassen möchten. Das Skript verwendet
trap
, um ctrl- c(oderSIGTERM
) zu fangen , den Befehl abzubrechen (den ichsleep
hier als Test verwendet habe) und zu beenden.quelle
trap "exit 0" SIGINT SIGTERM; while true; do netcat -l -p 3000; done
trap
Ansatz auf die gleiche (bash) Skript mit der Endlos - Schleife getötet werden, verwenden$$
statt$!
(siehe hier )Ich halte im Allgemeinen nur gedrückt Ctrl-C. Früher oder später wird es sich zwischen registrieren
COMMAND
und somit diewhile
Schleife beenden . Vielleicht gibt es einen besseren Weg.quelle
paplay
bei einer 1s-Datei.Wenn Sie bash mit
-e
diesem Befehl ausführen, wird das Programm unter folgenden Fehlerbedingungen beendet:quelle
Warum nicht einfach,
Oder wenn in einem Skript verwendet,
quelle
Ich bevorzuge eine andere Lösung:
Um die Schleife zu beenden, machen Sie einfach Folgendes:
quelle
while :
erstellt eine Endlosschleife und erspart Ihnen das Schreiben der[ 1 ]
Dadurch wird die PID gedruckt. Wenn Sie Ihre Eingabeaufforderung mit
ctrl+d
beenden, wird der Hintergrundjob nicht beendet, und Sie können den Job später von überall mit beendenkill PID
Wenn Sie die Übersicht über Ihre PID verlieren, können Sie
pstree -pa $USER
oder verwendenpgrep -fl '.*PROCESS.*'
, um sie zu findenquelle
Verwenden Sie
trap
-quelle