Cron läuft nicht an einem bestimmten Tag, sondern an allen anderen Tagen

8

Ich habe ein Cron-Setup, um täglich um 22 Uhr ein Bash-Skript auszuführen. Ich habe ein weiteres Cron-Setup, das monatlich am 1. des Monats ausgeführt wird. Beide Cron starten ein Bash-Skript, und der einzige Unterschied im Bash-Skript ist das Argument, das sie an das zugrunde liegende Java-Programm übergeben (Emulation des Befehlszeilenstarts des Java-Programms).

Das Problem ist, dass ich die tägliche Cron am 1. des Monats irgendwie deaktivieren muss, damit beide nicht versuchen, am selben Tag zu laufen. Ist das automatisch möglich?

Ich nehme an, ich kann ein anderes Bash-Skript erstellen, um das Cron vor dem ersten zu bearbeiten, und danach erneut, um die Dinge wieder einzurichten, aber das scheint ... unrein.

SnakeDoc
quelle
Nicht alle Monate haben 31 Tage, würde das nicht ein Problem verursachen?
SnakeDoc
Nein
Stéphane Chazelas
eine gute Alternative zu der Lösung von @suspectus
SnakeDoc
2
oder 2-31 für das Feld Tag des Monats.
Asche
@ash - siehe meine Antwort, genau das habe ich vorgeschlagen.
slm

Antworten:

10

Ähnlich wie bei der von @StephaneChazelas in den Kommentaren vorgeschlagenen Lösung können Sie den Tagesbereich im 3. Feld als Bereich für den Cron angeben, auf dem Sie jeden Tag außer dem 1. des Monats ausführen möchten.

Die folgenden zwei Einträge würden das erreichen, wonach Sie suchen:

   0 22 1 * *      /path/to/script/1st_of_the_month.bash    
   0 22 2-31 * *   /path/to/script/every_day_except_1st.bash
slm
quelle
eigentlich nicht , für mich zu arbeiten scheint (es sei denn , ich etwas falsch mache) - in den Kommentaren der Formatierung ist schrecklich - so meinen pastbin finden Sie für das, was ich erhalte: pastebin.com/RKvy5d4e
SnakeDoc
Hoppla, in Ihrem Beispiel sollte es 0 22 2-31 * * sein. Ich werde bearbeiten.
SnakeDoc
1
@ SnakeDoc - danke, alle diese Spalten beginnen nach einer Weile zu mischen 8-)
slm
yup ich vergesse sie auch - ich
richte
8

Der einfachste Weg, damit umzugehen, ist nur ein Cron-Eintrag. Ändern Sie das Bash-Skript, um das Datum zu überprüfen. Wenn es der 1. des Monats ist, rufen Sie das Java-Programm mit monatlichen Parametern auf, andernfalls rufen Sie das Programm mit den täglichen Parametern auf.

Das Ändern des Skripts vereinfacht den Vorgang, da das Skript als Dokument besser beschreibt, was passiert, ohne dass zusätzliche Informationen in einer Cron-Tabelle erforderlich sind.

Die Skript-Mods könnten ungefähr so ​​aussehen:

if [ $(date '+%d') == "1" ];then
   # monthly code
else
   # daily code
fi
Verdächtiger
quelle
1
endete mit dieser Lösung. Ich habe ein weiteres Bash-Skript mit Ihrem Beispielcode erstellt und unter monatlich - es startet das monatliche Bash-Skript (das wiederum das monatliche Argument an das zugrunde liegende Java-Programm
weiterleitet
0
if [ $(date '+%d') == "1" ];then
  # monthly code
else
   # daily code
fi

Ich denke, mit Ganzzahlvergleich, wenn korrekter

Datum '+% d' gibt 01 statt 1 zurück, daher ist die Verwendung von == string compareaison falsch

stattdessen

if [ $(date '+%d') eq 1 ];then
    # monthly code
else
   # daily code
fi
Wodel
quelle