Cron soll jeden 2. Mittwoch laufen?

9

Ich muss einen Weg finden, einen Job so zu gestalten, dass er jeden zweiten Mittwoch im Monat läuft. Ist das möglich?


quelle
1
Diese Frage scheint eine angemessene Antwort zu geben.
Scurker
1
Ja, aber diese Frage bezieht sich auf Di, nicht auf Mi;) Die akzeptierte Antwort ist jedoch klug.
Edoloughlin
>> Ja, aber diese Frage betrifft Di, nicht Mi;) Die akzeptierte Antwort ist jedoch klug ... was ist so schwer, Di in Mi zu ändern?
Ajreal
0 * * * 3 test $ (date \ +% u) -eq 3 && echo "start run me" versuche dies. Die Antwort wurde nicht eingefügt, da eine Liner-Frage ziemlich vage ist.

Antworten:

14

Meine Manpage für Crontab (die ich leider nicht online zu finden scheine) enthält das folgende Beispiel:

# Run on every second Saturday of the month
0 4 8-14 * *    test $(date +\%u) -eq 6 && echo "2nd Saturday"

Anpassung an Ihre Zwecke ...

0 4 8-14 * *    test $(date +\%u) -eq 3 && job.sh
Hasturkun
quelle
3
Für alle, die diese Antwort bearbeiten möchten, ist der Grund, warum Sie nicht nur das Feld Wochentag verwenden, dass *der Befehl ausgeführt wird , wenn sowohl der Wochentag als auch der Wochentag eingeschränkt sind (dh nicht ), wenn einer der beiden übereinstimmt .
Hasturkun
1
Ich fand, dass ich dem% u entkommen musste, also:date +\%u
Antony D'Andrea
2

Sie können das Ausführen eines externen Skripts vermeiden, indem Sie eine Kombination aus dem Wochentagstrick und dem Wochentag verwenden:

# Run on every second Wednesday of the month
0 4 8-14 * Wed job.sh

Dadurch wird auch vermieden, dass ein anderes externes Programm ausgeführt wird. Die 8-14 wählt alle Tage aus, die der zweiten Woche des Monats entsprechen. Dann filtert es gerade an diesem Mittwoch heraus.

Kyle Berger
quelle
1

Es ist nicht möglich, cron alleine zu verwenden, aber Sie können einmal pro Woche ein Skript aufrufen, das den Test ausführt:

Führen Sie in crontab jeden Mittwoch um 12.00 Uhr second_wed.sh aus:

0 12 * * 3 /home/you/bin/second_wed.sh

In second_wed.sh:

#!/usr/bin/env bash
day_of_month=`date +"%
if [ $day_of_month -gt 7 -a $day_of_month -lt 15 ]; then
  # Call your program here instead of 'ls'…
  ls
fi
Edoloughlin
quelle
1

Basierend auf dieser Antwort können Sie Folgendes tun:

00 12 * * Wed expr `date +\%d` \> 7 \& `date +\%d` \< 15 >/dev/null && runJob.sh
Gemeinschaft
quelle
1

Für CentOS 7-Server scheint dies die Syntax zu sein, die für mich funktioniert. Bitte beachten Sie die Leerzeichen um [und ]. Es dauerte eine Weile, bis ich es herausgefunden hatte.

Dadurch wird die test.shDatei am zweiten Mittwoch des Monats um 13:07 / 13:07 Uhr ausgeführt. (0 = Sonntag, 1 = Montag, 2 = Dienstag, 3 = Mittwoch usw.)

07 13 8-14 * * [ `date +\%u` = 3 ] &&  /root/scripts/test.sh
eglescout
quelle