Sie müssen nur selbst rechnen, um die erforderlichen Jobs zu finden, die Ihr Timing erreichen.
0 0-23/7 * * * whatever
30 3-23/7 * * * whatever
Aus diesen beiden Beispielen (bei 30 Minuten Versatz) lässt sich ein einfacher Algorithmus ableiten:
- Fügen Sie zwei Einträge hinzu:einen mit 0 Minuten Versatz und einen mit 30 Minuten Versatz.
- Geben Sie die Stundenbereichsbreite gleich
duration * 2
an . - Stunden-Offset angeben:Eine beginnt mit 0 und die andere beginnt mit der Dauer nach dem Verwerfen des 30-Minuten-Teils.
Wenn Sie mehr nachdenken, können Sie etwa alle 75 Minuten ähnliche Lösungen finden.
Bearbeiten:
Cron kann nicht für alle Arten von geplanten Jobs verwendet werden. Beispiel:Ausführen eines Jobs einmal im Monat am letzten Tag des Monats. Sie können es nicht einfach mit cron tun, da sich der letzte Tag des Monats von Monat zu Monat ändert. Um dies zu lösen, können Sie einen Cron-Job im möglichen Wertebereich des letzten Tages des Monats (28-31) ausführen und überprüfen, ob es sich wirklich um den letzten Tag im Skript handelt oder nicht, bevor Sie den eigentlichen Job ausführen.
Setzen Sie das Ergebnis des Befehls
date +%s
in einer Variablen in Ihrer Crontab. Etwas wie TIME=1497950105. Jetzt brauchen Sie in Ihrer Crontab einen Eintrag wie
* * * * * /bin/bash -c '[[ $(($(date +\%s)-TIME)) -gt seconds ]] && TIME=$(date +\%s) && whatever'
Wobei Sekunden die gewünschte Anzahl von Sekunden ist (in Ihrem Fall 12600).
Oder wenn Sie 3 Stunden und 30 Minuten nach Abschluss des Programms warten möchten
* * * * * /bin/bash -c '[[ $(($(date +\%s)-TIME)) -gt seconds ]] && whatever && TIME=$(date +\%s)'
Bearbeiten: Ich habe meine vorherige Antwort korrigiert:
- Sie müssen das %-Zeichen mit \ maskieren, also %s wird zu \%s
- Sie müssen dem Befehl /bin/bash -c voranstellen
Eine andere Lösung (ohne TIME zu verwenden) ist:
* * * * * /bin/bash -c '[[ $((($(date +\%s) / 60) % minutes)) -eq 0 ]] && whatever'
Wobei Minuten in Ihrem Fall 210 sind.
Änderung 2:
Wie von MSalters vorgeschlagen, ist es besser, den Eintrag alle N Minuten auszuführen, wobei N der größte gemeinsame Teiler zwischen 60 und Ihrem Zeitintervall in Minuten ist
In diesem Fall denke ich, dass Sie einfach versuchen, cron zu verwenden, um etwas zu tun, was es nicht selbst tun kann (natürlich mit Ausnahme der Lösungen, bei denen cron tatsächlich regelmäßig ein Hilfsskript ausführt, in diesem Fall würde ich argumentieren, dass es nicht cron ist löst das Problem selbst).
Die Lösung mit dem Intervall von 3 Stunden 30 Minuten ist nicht ganz richtig. Dies war die angegebene Lösung:
0 0-23/7 * * * whatever
30 3-23/7 * * * whatever
Der Grund dafür ist, dass cron den Job dann zu den Zeiten 21:00 und 00:00 ausführt, was einem Intervall von 3 Stunden statt 3 Stunden 30 Minuten entspricht.
Eine allgemeine Lösung für alle Zeitintervalle müsste in der Lage sein, Fälle zu behandeln, die sich nicht gleichmäßig in 24 Stunden aufteilen. Es teilt sich zwar nicht gleichmäßig in 24 Stunden, aber gleichmäßig in eine Woche! Die einfachste Art, sich das vorzustellen, ist, zwei überlappende Sätze „alle 7 Stunden“ zu machen, wie hier:
0 0-23/7 * * 1 whatever
0 4-23/7 * * 2 whatever
0 1-23/7 * * 3 whatever
0 5-23/7 * * 4 whatever
0 2-23/7 * * 5 whatever
0 6-23/7 * * 6 whatever
0 3-23/7 * * 7 whatever
30 3-23/7 * * 1 whatever
30 0-23/7 * * 2 whatever
30 4-23/7 * * 3 whatever
30 1-23/7 * * 4 whatever
30 5-23/7 * * 5 whatever
30 2-23/7 * * 6 whatever
30 6-23/7 * * 7 whatever
Etwas, das durch eine Woche teilbar ist, ist das Beste, was Sie tun können, weil Monate nicht perfekt mit Wochen übereinstimmen, und nur so ist es machbar. Zum Beispiel ist ein Intervall von genau 12 Minuten in einer Zeile von crontab trivial, aber ein Intervall von genau 11 Minuten ist unmöglich, weil 10080 nicht durch 11 teilbar ist (10080 ist die Anzahl der Minuten in einer Woche).
Es wäre definitiv möglich, einen Algorithmus zu schreiben, um die Fälle zu lösen, in denen dies möglich ist, aber es ist eindeutig nicht viel wert, insbesondere wenn man bedenkt, wie die Lösungen tatsächlich aussehen würden.