Cronjob läuft alle zwei Wochen, am Samstag, ab diesem Samstag

11

Heute ist Freitag, 3. Oktober 2014, 03:58 Uhr

Ich möchte einen solchen Cronjob planen, um ihn an folgenden Daten auszuführen:

  1. Samstag, 4. Oktober 2014, 8:00 Uhr
  2. Samstag, 18. Oktober 2014, 8:00 Uhr
  3. Samstag, 1. November 2014, 8:00 Uhr ... ...

Also alle 2 Wochen, am Samstag, um 8 Uhr.

kupa
quelle

Antworten:

27
0 8 * * 6 test $((10#$(date +\%W)\%2)) -eq 1 && yourCommand

date +%W: Woche Nummer des Jahres mit Montag als erstem Wochentag, heute Woche 39

10#$(date +%W): Konvertieren Sie die date +WDezimalzahl und vermeiden Sie Verwirrung beim Parsen der Shell-Basis

$((39%2)): modulo operation: Ergebnis ist 0 (gerade Wochennummer) oder 1 (ungerade Wochennummer), dieses Wochenergebnis ist 1, nächste Woche 0

test 1 -eq 1: arithmetischer Test (gleich), in diesem Fall ist das Ergebnis boolean true

&& yourCommand: Boolean AND: yourCommandNur ausführen , wenn das Ergebnis des vorherigen Befehls boolean true war

Beachten Sie, dass das Jahr zwei ungerade Wochen haben kann: 53 (dieses Jahr) und 1 (nächstes Jahr)

Cyrus
quelle
2
Das ist elegant! Wie Sie bereits bemerkt haben, gibt es am 53. Samstag im Jahr immer noch einen Eckfall, der alle vier Jahrhunderte ungefähr siebzig Jahre dauern wird.
MadHatter
@ Cyrus, danke für deine Antwort, aber wenn ich * * * * 5 test $ (($ (Datum +% W)% 2)) -eq 1 && /u02/restore/scripts/test.sh schreibe, funktioniert das Skript nicht laufe aber wenn ich schreibe * * * * 5 /u02/restore/scripts/test.sh Skript läuft. Warum funktioniert dein Ausdruck nicht? Ich habe nur die Fälle getestet. Und festgestellt, dass das irgendwie nicht funktioniert.
Kupa
1
Mein Fehler. Cron interpretiert% als Zeilenumbruch. Entkomme beiden% mit einem \ in deinem Cronjob:0 8 * * 6 test $(($(date +\%W)\%2)) -eq 1 && yourCommand
Cyrus
Es tut mir leid, diese alte Frage zurückzubringen, aber sie hat bei mir nicht funktioniert. Wenn ich versuche, $((10#$(date +%W)%2)) -eq 1 && echo OKmeine Shell auszuführen , versucht ich, das Ergebnis der Wochenberechnung auszuführen : -bash: 1: command not found. Irgendein Hinweis, warum es das tut? Vielen Dank.
Jhuet
3
@jhuet: testist kein Benutzer, es ist ein Befehl. Versuchen Sie:test $((10#$(date +\%W)%2)) -eq 1 && echo odd || echo even
Cyrus
4

Was Sie gezeigt haben, ist "jede Woche". Dann lautet der Code:

0 8 * * 6

Sind Sie sicher, dass Sie es alle zwei Wochen ausführen müssen?

0 8 * * 6 expr `date +\%s` / 604800 \% 2 >/dev/null || yourCommand
Glueon
quelle
1
Können Sie den Befehl, bitte erklären
kupa
1
Es ist besser, das zu verwenden, was Cyrus gegeben hat - $ (($ (Datum +% W)% 2)) "W" steht für eine Wochennummer im Jahr. Von null bis 53. Wenn es durch zwei geteilt werden kann, dann ist es Ihre "jede Sekunde" Woche. Cronjob läuft also jede Woche, aber der 'expr' führt den Befehl yourCommand nur aus, wenn die
Wochennummer
Wenn ich test $ (($ (Datum +% W)% 2)) -eq 1 in der Befehlszeile ausführe, wird nichts zurückgegeben. Warum?
Kupa
1
Führen Sie es einfach aus, echo $?nachdem Sie diesen Befehl ausgeführt haben, um seinen Rückkehrcode zu sehen - das ist wichtig
Ale