Gibt es eine Möglichkeit, zeitbasierte Befehle auszuführen, wenn ich einen langen Prozess ausführe?
Zum Beispiel führe ich einen sehr langen Prozess aus, der ungefähr 10 Minuten dauert.
Nach 5 Minuten möchte ich einen separaten Befehl ausführen. Zur Veranschaulichung könnte der separate Befehl sein:echo 5 minutes complete
(Hinweis: Ich möchte keine Fortschritte bei der Ausführung des Befehls machen, sondern nur Befehle, die nach festgelegten Intervallen ausgeführt werden.)
Ist es möglich?
shell-script
shell
delay
Aniket Bhattacharyea
quelle
quelle
longcommand & sleep 300 && command-to-do-after-five-minutes
? (Eigentlich ist es wahrscheinlich das, wonach Sie suchen.) Beachten Sie, dass Ihre Klärung nicht ausreichte, da Sie gleich zwei Clock-Progress-Bar-Implementierungen erhalten haben.Antworten:
Renn einfach:
Der
do-this-after-five-minutes
wird nach fünf Minuten ausgeführt. Dielong-command
läuft im Hintergrund.quelle
sleep 5m && foobar
, wenn ich meine Meinung ändere und ^ C dassleep
, wird der nächste Befehl nicht ausgeführt.sleep 3; ls
und getestet habe^C
, läuft der zweite Befehl sowieso nicht. Nicht wirklich sicher, warum und vielleicht funktioniert es in einer nicht interaktiven Shell anders?sleep 5m && echo
Sie in den Ruhemodus wechseln, wird nur dersleep
Befehl angehalten. Der Rest der Befehlszeile wird ausgeführt, aber da siesleep
angehalten wurde, wurde sie nicht erfolgreich beendet und der Teil danach&&
wird übersprungen. Versuchen Sie es mit Suspendierensleep 5 || echo hello
und eshello
wird direkt nach dem Drücken von angezeigt^Z
.at(1)
, für Dinge wie diesleep 30m && mplayer something.mp3
Erinnerungsleep 90m && fg
an einen Alarm oder um später einen plattenintensiven Befehl wieder aufzunehmen. Also eigentlichsleep 5m && echo hello
ist das schön, weil ohne Ausführen des folgenden Befehls überhaupt^Z
pausiertsleep
. Wenn Sie in der Lage sein möchten, den gesamten zusammengesetzten Befehl vor dem Beenden des Ruhezustands anzuhalten / fortzusetzen, verwenden Sie( sleep 2 && echo hello )
.&&
Idiom können Sie absolut sicher sein , Sie töten den Prozess nicht direkt nach dem Schlaf läuft (da kann man^Z
nicht den Befehl auszuführen, statt eine zu riskieren^C
). Dies ist nützlich imsleep && fg
odersleep && bg
Anwendungsfall, wenn der Befehl, der fortgesetzt wird, auf halbem Weg durch etwas Langsames ist.Sie könnten dieses Skript verwenden:
Es führt Ihre
longprocess
in einersub-shell
und überwacht dann zuvor erstellte "Lock" -Datei auf Existenz.quelle
man bash
aufSECONDS
. Sie könnenSECONDS=0
beim Start des SkriptsSECONDS=$((date +%s))
date
sleep 1s
immer genau eine Sekunde später ist als vorhersleep 1s
... dann sind Sie Opfer von Lügen geworden, die Programmierer über die Zeit glauben . (In diesem Fall können Sie jedoch auch einfach einen Fortschrittsbalken für die Hashmarkierung oder etwassleep
!SECONDS
! :)Es gibt einen Einzeiler dafür:
In Ihrem Fall ist TIMEOUT = 5m und COMMAND ist der lange Befehl.
Siehe auch meine Antwort auf diesen Beitrag Timeout mit "Service-Netzwerk-Neustart"
quelle
jobs %1
schlägt fehl, sobald der Job% 1 gestoppt wurde.Beachten Sie, dass $ seconds für längere Zeit möglicherweise nicht mit der Echtzeit synchronisiert ist. Es ist besser, die Startzeit zu speichern und die Differenz zur tatsächlichen Zeit zu berechnen.
quelle