Wie plane ich einen zweiwöchentlichen Cronjob?

10

crontab (5) definiert die folgenden Felder:

       field         allowed values
       -----         --------------
       minute        0-59
       hour          0-23
       day of month  1-31
       month         1-12 (or names, see below)
       day of week   0-7 (0 or 7 is Sun, or use names)

und erklärt:

 Step values can be used in conjunction with ranges.  Following a range
 with ``/<number>'' specifies skips of the number's value through the
 range.  For example, ``0-23/2'' can be used in the hours field to specify
 command execution every other hour (the alternative in the V7 standard is
 ``0,2,4,6,8,10,12,14,16,18,20,22'').

Also keine zweiwöchentlichen Jobs, soweit ich weiß. Ich bin mir ziemlich sicher, dass es Problemumgehungen gibt. Was sind Ihre? Oder habe ich etwas verpasst?

römisch
quelle
2
Die beste Antwort, die ich dazu finden kann, ist hier: unix.stackexchange.com/questions/1224/…
Somantra
... und diese Antworten auf U & L wären so, wie ich es machen würde, @Somantra :-)
voretaq7
@ voretaq7, ich hätte gesagt, es war die kanonische Antwort, aber ich wollte nicht als pedantisch
rüberkommen ;-)

Antworten:

8

Sie können das Ding jeden Mittwoch von cron laufen lassen und dann entscheiden lassen, ob es eine gerade oder eine ungerade Woche ist. beispielsweise:

#!/bin/bash
week=$(date +%U)
if [ $(($week % 2)) == 0 ]; then 
    echo even week
else 
    echo odd week
fi
Eintopf
quelle
Dies ist eine nette Lösung, die jedoch die Frage selbst nicht wirklich beantwortet - ich würde es vorziehen, die Sache nicht mit Zeitplanlogik zu beschmutzen. Vielleicht kann ich das mit dem Link integrieren, den @Somantra gegeben hat.
Roman
Okay, ich muss zugeben: Dies ist die bisher beste Lösung. Der Link, den @Somantra gegeben hat, erzielt die gleichen Ergebnisse, die meiner Meinung nach unnötig komplex sind (mit UNIX-Zeit gerechnet), aber wenn Sie Ihren Ansatz direkt zum Cronjob (anstelle des Skripts) im selben Stil hinzufügen, ist er recht elegant.
Roman
Dies bricht im Jahr 2020, weil es 53 Wochen hat. Beispiel: Wenn Ihr Cron am 31. Dezember zweiwöchentlich ausgeführt werden soll, wird er am 31. Dezember 2020 (53. Woche) und am 4. Januar 2020 (1. Woche) ausgeführt.
mad_fox
4

Viele Cron (Sie haben nicht angegeben, welche Sie verwenden) unterstützen Bereiche. Also so etwas wie

0 0 1-7,15-21 * 3

Würde den ersten und dritten Mittwoch des Monats treffen.

Vierbeiner
quelle
Dies ist etwas eleganter als die Methode "Mach es im Skript", aber denk daran, deiner Crontab einen Kommentar hinzuzufügen (allgemeine Faustregel: Wenn du mehr als eine hast -oder /beteiligt bist, lohnt es sich wahrscheinlich, den Zeitplan zu beschreiben)
voretaq7
Ich vermute, das ist falsch; Dadurch wird der Job am 1.-7. und 15.-21. eines jeden Monats und auch jeden Mittwoch ausgeführt. Das aus man 5 crontab: " Der Tag der Ausführung des Befehls kann durch zwei Felder angegeben werden - Tag des Monats, und Wochentag Wenn beiden Felder beschränkt sind (dh nicht *), wird der Befehl ausgeführt werden , wenn. Entweder Feld der Spiele Aktuelle Zeit. Zum Beispiel würde "30 4 1,15 * 5" dazu führen, dass ein Befehl am 1. und 15. eines jeden Monats sowie jeden Freitag um 4:30 Uhr ausgeführt wird "(meine Betonung).
MadHatter
1
Das hängt davon ab, welchen Cron-Daemon Sie verwenden. Ihr Eintrag scheint von vixie cron zu stammen (in RedHat-Distributionen enthalten). Aus "man crontab" auf dillos cron (Slackware): Wenn Sie sowohl einen Tag im Monat als auch einen Wochentag angeben, * wird dies als der n-te Tag im Monat * interpretiert. Eine Skriptlösung (Berechnung der Wochenzahl) scheint jedoch die einzige tragbare Lösung zu sein.
AlvaroGMJ
2

Verwenden Sie für etwas, das alle zwei Wochen ausgeführt werden muss, diesen Einzeiler:

0 0 * * 5 [ `expr \`date +\%V\` \% 2` -eq 0 ] && echo "execute script" 

Dieses spezielle Skript soll freitags ausgeführt werden. Die Woche, für die ausgeführt werden soll, kann mit "-eq 0" oder "-eq 1" angepasst werden.

AlexY
quelle
1

Anacron ist eine gute Lösung für die Einschränkungen von Cron.

  • Anacron verfügt über einen Parameter für die Wiederholungsperiode , den Sie auf 14 einstellen können.

Periodenverzögerung Job-ID-Befehl

14 15 test.daily /path/to/script.sh

Somantra
quelle
Anacron kann leider nicht verwendet werden. Ich habe vergessen, das zu erwähnen.
Roman
1

Wenn Ihre Bedürfnisse nicht buchstäblich zweiwöchentlich sind, können Sie den Cronjob einfach am 1. und 15. des Monats ausführen:

15 8 1,15 * * /your/script.sh

Das läuft am ersten und fünfzehnten eines jeden Monats um 8:15 Uhr, unabhängig vom Wochentag.

Chris Brewer
quelle
-2

Ausgehend von dieser Erklärung sollte die Einstellung 3/2 im Wochenfeld die Aufgabe an jedem zweiten Mittwoch ausführen - implizit, aber ich denke machbar.

Geselle Geek
quelle
Nein, dies ist äquivalent zu, for(int i=3; i <=3 ; i+=2) {} da es nur einmal durchlaufen wird. Es spielt keine Rolle, ob der "Schritt" 1 oder 2 ist.
Eintopf
Was @stew gesagt hat. Es gibt auch kein "Wochenfeld".
Roman
Mit Wochenfeld meine ich das "Wochentagsfeld"
Geselle Geek