Das traditionelle Werkzeug zum Vergleichen von Zeitmarken, um zu bestimmen, ob der Arbeit durchgeführt werden muss oder nicht, ist make
. Sein Standardverhalten besteht darin, eine Abhängigkeitskette für die angegebenen Ziele zu berechnen und festzustellen, ob sich eine der abhängigen Dateien geändert hat. Wenn nicht, muss das Ziel nicht erneut erstellt werden. Dies ist ein großartiges Werkzeug, um die Neukompilierung zu vermeiden, aber es erstreckt sich leicht auf andere Aufgaben.
Konkret würden Sie eine Flag-Datei erstellen (z. B. .made
) und diese als abhängig von Ihrer file
angeben. Wenn nun file
geändert wurde, muss .made
neu erstellt werden, und make
führt die von Ihnen angegebenen Befehle aus. In diesem Szenario würden wir ein einfaches Stück Shell-Skript ausführen, dann touch .made
, um die letzte (erfolgreiche) Laufzeit zu zukünftigen Läufen zu kommunizieren.
Was bleibt, ist, dass das Rezept verschiedene Befehle zu verschiedenen Zeiten ausführt. Mein Ansatz dazu wäre eine einfache case
Aussage. Beachten Sie, dass make
Dollarzeichen interpretiert, also müssen wir die Dollarzeichen, die an die Shell übergeben werden sollen, verdoppeln.
.made: file
case $$(date +%H:%M) in \
09:* | 10:* | 11:[0-2]?) \
scriptA.sh ;; \
11:[3-5]? | 1[2-6]:* | 17:[0-3]? | 17:4[0-5]) \
scriptB.sh;; \
17:4[6-9] | 17:5? | 1[89]:* | 2?:* | 0[0-8]:*) \
scriptC.sh;; \
esac
touch [email protected] # [email protected] expands to the current target
Die gesamte case
Anweisung muss als eine einzige logische Linie an der Shell übergeben werden, so dass wir am Ende mit diesen lästigen Schrägstrichen bis zu den Zeilenumbrüche zu entkommen.
Beachten Sie auch, dass make
wählerisch über Einrückung ist; Vor jeder (logischen) Zeile im Rezept sollte ein literales Tabulatorzeichen stehen.
Das Standardverhalten von make
ist, das erste Ziel in der Datei auszuführen; Diese Makefile
enthält nur ein Ziel, also make
entspricht make .made
.
Beachten Sie auch, dass make
kümmert sich um Exit-Codes; Wenn scriptA
, scriptB
oder scriptC
mit einem Nicht-Null-Beendigungsstatus beendet werden kann, wird dies von make
als schwerwiegender Fehler betrachtet, und die Datei .made
wird nicht aktualisiert. (Sie können jedoch leicht guard against this.)
Sie könnten etwas mit "Datum" und seiner Formatierung tun, Zeitstempel in Minuten des Tages verwandeln. Z.B. '$ (Datum +"% H ") * 60 + $ (Datum +"% S ")'. (Die Multiplikation und Addition sind keine richtige Bash, eher symbolisch.) – Evert
Aber ich denke, dass Ihr Cron-Job, mit einem vierten Skript, das nur ein Symlink zu dem aktuellen relevanten Skript ist, keine schlechte Idee ist. – Evert
Was bedeutet "geändert"? Wurde seit wann geändert? –