Bedeutet 31 notwendigerweise das Monatsende in einem Cron-Job?

13

Wir wissen, dass wir für Cron-Jobs die Zeit wie folgt einstellen können.

# +------------ Minute (0 - 59)
# | +---------- Hour (0 - 23)
# | | +-------- Day of the Month (1 - 31)
# | | | +------ Month (1 - 12)
# | | | | +---- Day of the Week (0 - 7) (Sunday is 0 or 7)
# | | | | |
# * * * * * command

Was ich wissen möchte ist, dass wenn wir den Tag des Monats 31 festlegen, dies das Ende eines jeden Monats bedeutet, obwohl der Monat keinen Tag 31 hat. Ich hoffe, eine Antwort zu bekommen.

Danke im Voraus

Squillman
quelle

Antworten:

22

Nein, 31 bedeutet 31.

Sie können jedoch einige Tricks machen. Stellen Sie den Job so ein, dass er an einem beliebigen Tag ausgeführt wird, der möglicherweise der letzte Tag des Monats ist (dh 28-31 im Feld Tag des Monats), und ersetzen Sie dann Ihren Befehl durch einen Shell-Ausdruck, der einen Test zum Datum des Schutzes des Monats enthält Befehl:

0 0 28-31 * * [ "`date +%m`" != "`date --date=tomorrow +%m`" ] && command

Der Ausdruck in den Testklammern fragt nur, ob die heutige Monatszahl von der morgigen Monatszahl abweicht, was natürlich nur am letzten Tag des Monats zutrifft. Beachten Sie, dass die Form dieses Ausdrucks von Ihrem lokalen Ausdruck abhängt. dateMöglicherweise müssen Sie ihn anpassen, wenn Sie nicht über die aktuelle GNU-Version verfügen.

Ich sollte sagen, dass ich das nicht erfunden habe - ich habe es mit einem schnellen Google in einem Mailinglisten-Beitrag von Matthew Jarvis gefunden. Ich würde mir allerdings vorstellen, dass dies ein normaler Trick eines alten Unix-Assistenten ist.

Tom Anderson
quelle
1
Angesichts
4
Auf Stackexchange-Websites ist es KEINE schlechte Sache, eine Frage zu stellen, die mit einer Google-Suche beantwortet werden kann. Tatsächlich ist es eine gute Sache, da die nächste Person, die dies in Google sucht, die Antwort auf stackexchange findet und hierher kommt.
Miernik
12

Nein, ich denke, das Beste, was Sie tun können, ist, am 1. des Monats um Mitternacht zu laufen oder für jeden Monat individuelle Crontab-Linien einzurichten (oder zumindest eine Linie für Monate mit 28,29,30 und 31 Tagen).

0 0 28,29 2               * /my/command
0 0 30    4,6,9,11        * /my/command
0 0 31    1,3,5,7,8,10,12 * /my/command
Paul Dixon
quelle
Danke Paul! Ich werde dem zweiten folgen. Muss ich für die zweite Methode dieselbe Datei dreimal richtig einstellen?
Ja, Sie müssen es wiederholen.
Paul Dixon
7
Ich habe keine Erfahrung mit Cron, aber würde "0 0 28,29 2" nicht zweimal in einem Schaltjahr ausgeführt? Nicht, dass dies für die nächsten zwei Jahre ein Problem sein würde, aber dennoch ...
Wim ten Brink
Das ist ein guter Punkt, kein einfacher Weg, um das
Paul Dixon
4

Ich glaube nicht, dass Sie dies in der EU leicht tun können crontab.

Eine Möglichkeit wäre, crondas Skript jeden Tag auszuführen und dann das Skript selbst prüfen zu lassen, ob es der letzte Tag des Monats ist.

Dave Webb
quelle
3

Ich denke, Cron hat ein spezielles Zeichen 'L', das für diesen Zweck bestimmt ist:

*    *    L    *    *    your_script.sh 

würde Ihr Skript am letzten Tag eines jeden Monats ausführen

Auf der anderen Seite,

*    *    0    *    *    your_script.sh

Sie können sogar Folgendes angeben:

*    *    *    *    1,5L    your_scrript.sh

um das Skript am letzten Montag und Freitag eines jeden Monats auszuführen

oder

*    *    *    *    1    your_script.sh

um das Skript jeden Montag um Mitternacht auszuführen.

Saasira
quelle
0

Dies wird den Job machen:

if [ $( date +%-d --date="tomorrow" ) -eq 1 ]
then echo Last day of the current month
else echo Not yet!
     exit 0
fi

exit 1
Phil
quelle