Cronjob für den ersten Tag des Monats außer Sonntag

2877
Alexander Kim

Ich habe einen solchen Eintrag in meinem Crontab:

0 0 1-2 * 1-6

Ist es richtig, dass es von Montag bis Samstag um 00:00 Uhr am 1. oder 2. Tag des Monats läuft? Wenn zum Beispiel der 1. Tag Sonntag ist, wird er nicht ausgeführt, oder? Stattdessen wird am 2. Tag des Monats ein Cronjob ausgeführt, da es kein Sonntag sein wird.

2

1 Antwort auf die Frage

5
jaume

Wenn der erste Tag des Monats ein Sonntag ist, wird er tatsächlich ausgeführt.

Der Grund ist, dass die beiden Bedingungen "Tag des Monats" (drittes Feld) und "Wochentag" (fünftes Feld) nicht mit einem UND verknüpft sind (beide müssen vorkommen), sondern mit einem ODER (beide müssen vorkommen). Von man 5 crontab:

Hinweis: Der Tag, an dem ein Befehl ausgeführt wird, kann durch zwei Felder angegeben werden - Tag des Monats und Wochentag. Wenn beide Felder eingeschränkt sind (dh nicht *), wird der Befehl ausgeführt, wenn eines der Felder mit der aktuellen Uhrzeit übereinstimmt. Zum Beispiel würde "30 4 1,15 * 5" einen Befehl ausführen, der am 1. und 15. jeden Monats um 4:30 Uhr sowie jeden Freitag ausgeführt wird.

Ihr Cronjob läuft also jeden 1. und 2. des Monats um Mitternacht und zusätzlich jeden Mo, Di, Mi, Do, Fr und Sa des Monats.

Wenn Sie den Befehl nur einmal im Monat und nicht am Sonntag ausführen müssen, da Sie ihn in Ihren Kommentar schreiben, müssen Sie das Datum im Befehl selbst überprüfen .

Dies sind die Bedingungen, um den Befehl auszuführen:

IF (date is 1st day of month AND date is not Sunday)  OR (date is 2nd day of month AND yesterday was Sunday)  THEN run command 

Sie könnten zwei Cronjobs schreiben:

0 0 1 * * test $(date +\%u) -eq 7 || echo "today's the 1st day of the month but not Sun" 0 0 2 * * test $(date +\%u) -eq 1 && echo "today's Mon (=yesterday was Sun) and the 2nd day of the month" 

Der erste Cronjob wird an jedem ersten Tag des Monats um Mitternacht ausgeführt:

  • date +%uMon liefert eine ganze Zahl, wobei 1, 2 ist Di usw. (das ‚%‘ werden muss entkommen in einem crontab).

  • testüberprüft, ob $(date +%u1)equals 7(Sonntag).

  • ||Ist der boolesche Operator OR, reagiert er auf den Rückgabewert des vorherigen Befehls. Wenn testFALSE zurückgegeben wird, wird der Rest des Befehls ausgeführt.

Der zweite Cronjob wird jeden zweiten Tag des Monats um Mitternacht ausgeführt:

  • Gibt date +%uwieder eine ganze Zahl zurück, wobei 1 Mon, 2 Tue usw. ist.

  • testüberprüft, ob $(date +%u1)equals 1(Montag).

  • &&ist der AND- boolesche Operator. Wenn testTRUE zurückgegeben wird, wird der Rest des Befehls ausgeführt.

Danke, was bedeutet test in "test $ (date +% u) -eq 7"? Alexander Kim vor 10 Jahren 0
@Heihachi Ich habe meine Antwort bearbeitet, um das klar zu stellen. Weitere Informationen finden Sie unter "man test". jaume vor 10 Jahren 0
Ich habs. Wenn aber am ersten und zweiten Tag des Monats Montag und Dienstag sind, läuft Cron zweimal in einem Monat. Ich muss den Befehl nur einmal im Monat ausführen, aber nicht am Sonntag. Besserer Platz dafür ist in Bash-Skript selbst? Alexander Kim vor 10 Jahren 0
Danke, dass Sie das geklärt haben. Ich habe meine Antwort bearbeitet, ich schlage vor, dass Sie zwei Cronjobs schreiben (Sie könnten auch einen schreiben, aber die `test`-Anweisung wäre komplex.) jaume vor 10 Jahren 0