Ich habe eine Aufgabe, die in meinem Projektplan (3 Wochen) ausgeführt werden muss.
Ich kann cron einrichten , um dies jede Woche oder (zum Beispiel) in der 3. Woche eines jeden Monats zu tun - kann aber nicht alle drei Wochen einen Weg finden, dies zu tun.
Ich könnte das Skript hacken, um temporäre Dateien (oder ähnliches) zu erstellen, damit es funktioniert. Es war das dritte Mal, dass es ausgeführt wurde - aber diese Lösung riecht.
Kann es auf saubere Weise gemacht werden?
Antworten:
In der Crontab-Datei können Sie nur Folgendes angeben:
Es ist also nicht möglich anzugeben, welche Wochen gelten sollen.
Das Schreiben eines Wrapper-Skripts ist möglicherweise die beste Option.
Sie können die Wochennummer in einem Shell-Skript erhalten, indem Sie verwenden
oder
je nachdem, ob Sie möchten, dass Ihre Wochen am Sonntag oder Montag beginnen.
Also könntest du verwenden
Und $ check wäre in den Wochen 1, 4, 7, ... des Jahres 0.
quelle
Dank früherer Antworten wurde auf die Epochenoptionen bis Datum -e oder Formatierung als% s hingewiesen
Obwohl ein bisschen schmerzhaft
((date +%s) / 86400)
gibt Tage aus der Epoche.Wenn Sie sich darauf verlassen, dass der wöchentliche Job gleichzeitig ausgeführt wird, können Sie dies leicht anhand eines bestimmten Tages in einem Zeitraum von drei Wochen (
$epoch_day%21 == 13
z. B.) überprüfen.In meinem Fall ist dies in Ordnung, da es sich um eine One-Shot-Aufgabe handelt. Wenn es an einem bestimmten Tag verpasst wird, besteht keine Notwendigkeit, bei der nächsten Gelegenheit zu laufen.
quelle
Wenn Sie eine Zeitstempeldatei zwischen den Läufen speichern können, können Sie das Datum überprüfen, anstatt sich ausschließlich auf das aktuelle Datum zu verlassen.
Wenn Ihr Befehl find Bruchwerte für
-mtime
(oder hat-mmin
) unterstützt ( GNU find hat beides , POSIX scheint dies auch nicht zu erfordern ), können Sie die Cron-Jobs mit find and touch "drosseln" .Wenn Sie einen stat- Befehl haben, der das Anzeigen von Dateidaten als "Sekunden seit der Epoche" unterstützt (z. B. stat von Gnu coreutils , auch andere Implementierungen), können Sie Ihren eigenen Vergleich mit date , stat und den Vergleichsoperatoren der Shell (zusammen) durchführen mit Berührung , um eine Zeitstempeldatei zu aktualisieren). Möglicherweise können Sie auch ls anstelle von stat verwenden, wenn die Formatierung möglich ist (z. B. ls aus GNU-Dateiutils ).
Unten finden Sie ein Perl-Programm (ich habe es genannt
n-hours-ago
), das eine Zeitstempeldatei aktualisiert und erfolgreich beendet wird, wenn der ursprüngliche Zeitstempel alt genug war. Der Verwendungstext zeigt, wie er in einem Crontab-Eintrag verwendet wird, um einen Cron-Job zu drosseln. Außerdem werden Anpassungen für die „Sommerzeit“ und den Umgang mit „späten“ Zeitstempeln aus früheren Läufen beschrieben.quelle