Ich muss die Anwendung alle x Sekunden ausführen, also, solange cron auf diese Weise nicht mit Sekunden arbeitet, habe ich ein Bash-Skript mit Endlosschleife geschrieben, in dem X Sekunden schlafen.
Wenn ich das laufende Skript manuell stoppen muss, möchte ich es richtig machen - lasst die Anwendung funktionieren und lasst die Schleife nicht das nächste Mal eintreten.
Haben Sie eine Idee, wie dies erreicht werden kann? Ich habe über das Übergeben von Argumenten nachgedacht, aber ich konnte nicht herausfinden, wie man ein Argument zum Ausführen eines Skripts übergibt.
Sie könnten ein Signal fangen, sagen SIGUSR1:
%Vor%Wenn Sie die Schleife bei der nächsten Iteration beenden möchten:
%Vor% Dabei ist pid
die Prozess-ID des Skripts. Wenn das Signal während des Schlafs angehoben wird, wird es aufwachen (Schlaf schläft, bis ein Signal auftritt).
Die folgende Struktur ist möglicherweise angebracht, wenn Sie trotzdem eine Bereinigung vornehmen müssen. Verwenden Sie kill wie in cdarkes Antwort gezeigt.
%Vor%Die früher beschriebene Trap-Lösung eignet sich für große Schleifen, ist aber für den häufigen Fall, in dem Sie nur einen oder wenige Befehle durchlaufen, umständlich. In diesem Fall empfehle ich folgende Lösung:
%Vor% Dies beendet die Schleife, wenn der Befehl einen Nicht-Null-Beendigungscode hat, was passieren kann, wenn er unterbrochen wird. Solange also command
nicht SIGINT
behandelt, wird durch Drücken von ctrl-C der aktuelle Befehl beendet und die Schleife beendet.
Bearbeiten: Nachdem ich Ihre Frage genauer gelesen habe, sehe ich, dass der aktuelle Befehl weiter ausgeführt werden soll. In diesem Fall gilt diese Lösung nicht.
Tags und Links bash shell infinite-loop