Wie kann ich einen Cron schreiben, der ein bestimmtes Datum ausschließt?
Nehmen wir an: Ich muss an Wochenenden zwischen 18 und 21 Uhr alle 30 Minuten einen Crontab ausführen und möchte nur den 10. Mai 2014 ausschließen.
Ist das möglich? Wie kann ich das schreiben? Oder gibt es eine Alternative dafür? Bitte schlagen Sie etwas vor.
Antwort1
Die Standard-Cron-Syntax ist recht einfach und unterstützt keine Ausschlüsse. In einigen Fällen ist es möglich, eine Liste mit mehreren/vielen Cron-Einträgen zu erstellen, um eine solche Logik zu implementieren, aber das ist in der Regel mühsam und schwer zu verstehen oder zu pflegen; dieser Ansatz ist in Ihrem Fall jedoch nicht anwendbar (nicht zuletzt, weil Standard-Cron keine Vorstellung vom Kalenderjahr hat).
Es ist keine gute Idee, Cron-Befehle kompliziert zu machen, aber Sie können dies mit etwas relativ Einfachem tun, wie:
0,30 18-20 * * sat,sun [ "$(date +\%Y\%m\%d)" = "20140510" ] || mycommand
0 21 * * sat,sun [ "$(date +\%Y\%m\%d)" = "20140510" ] || mycommand
(Mit " 0,30 18-21
" würde die Aufgabe auch um 21:30 ausgeführt werden; Sie benötigen die zweite Zeile, wenn Sie möchten, dass sie auch um 21:00 ausgeführt wird, wenn nicht, lassen Sie sie weg.)
HINWEIS: Ineinige CrontabsSie müssen Prozentzeichen maskieren (diese werden verwendet, um Zeilenumbrüche anzuzeigen, wenn Inline-Daten in die Standardeingabe des Befehls eingefügt werden), allerdings nicht in Dillons Cron.
Der Cron-Befehl ist eigentlich eine ShellBefehlsliste, der ||
Kontrolloperator bietetKurzschlussauswertungvon Befehlen. Befehle in der Liste werden nacheinander von links nach rechts versucht, aber die Ausführung wird beendet, wenn der erste „true“ zurückgibt. Wenn der Datumszeichenfolgenvergleich „true“ zurückgibt (nur für einen Tag „true“), mycommand
wird er nicht ausgeführt, wenn der Datumsvergleich „false“ zurückgibt, mycommand
wird er ausgeführt.
Beachten Sie jedoch, dass es viele Unterschiede in der Art und Weise geben kann, wie Cron Programme startet. Der stabilste Ansatz ist die Verwendung eines Wrapper-Skripts zur Implementierung Ihrer bedingten Logik.
Antwort2
X-Y
Sie können für Zeitintervalle und für Frequenzen verwenden */Z
. Dabei gilt:
X
ist der Beginn des Intervalls.Y
ist das Ende des Intervalls.Z
ist nur ein Teiler (dh: eachZ
).
Um ein Datum auszuschließen, würde ich einfach mein eigenes Skript erstellen. Überprüfen Sie in diesem Skript das Datum und entscheiden Sie dann, ob Sie die folgende(n) Anweisung(en) ausführen möchten.