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.