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 +%u
Mon liefert eine ganze Zahl, wobei 1, 2 ist Di usw. (das ‚%‘ werden muss entkommen in einem crontab).test
überprüft, ob$(date +%u1)
equals7
(Sonntag).||
Ist der boolesche Operator OR, reagiert er auf den Rückgabewert des vorherigen Befehls. Wenntest
FALSE 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 +%u
wieder eine ganze Zahl zurück, wobei 1 Mon, 2 Tue usw. ist.test
überprüft, ob$(date +%u1)
equals1
(Montag).&&
ist der AND- boolesche Operator. Wenntest
TRUE zurückgegeben wird, wird der Rest des Befehls ausgeführt.