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?


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

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.


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.


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


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.


-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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.