Die Syntax, die Sie ausprobiert haben, ist tatsächlich mehrdeutig. Abhängig von der Anzahl der Tage im Monat, werden einige Monate an ungeraden Tagen und einige an geraden Tagen ausgeführt. Dies liegt daran, dass die Art und Weise, wie sie berechnet wird, die Gesamtzahl der Möglichkeiten aufnimmt und sie aufteilt. Sie können dieses seltsame Verhalten umgehen, indem Sie den Tagesbereich manuell angeben und entweder eine ungerade oder eine gerade Anzahl von Tagen verwenden. Da Skripte mit geraden Tagen niemals am 31. Tag längerer Monate ausgeführt werden, verlieren Sie nichts, wenn Sie 30 Tage als Basis für gerade Tage verwenden. Wenn Sie angeben, dass die Aufteilung so erfolgen soll, als gäbe es 31 Tage, können Sie ungerade Werte erzwingen -tägige Ausführung.
Die Syntax würde folgendermaßen aussehen:
# Will only run on odd days:
0 0 1-31/2 * * command
# Will only run on even days:
0 0 2-30/2 * * command
Ihre Besorgnis über Monate, die nicht die gleiche Anzahl von Tagen haben, ist hier nicht wichtig, da keine Monate MEHR Tage als diese haben und der Datumsbereich für den schlechten Februar nicht immer mit dem oder den letzten beiden Tagen übereinstimmt, aber es schadet nichts es aufgelistet.
Das einzige "gotcha" für diesen Ansatz ist, dass, wenn Sie sich in einem ungeraden Tageszyklus befinden, nach Monaten mit 31 Tagen Ihr Befehl auch am Ersten des Monats ausgeführt wird. Wenn Sie einen geraden Zyklus erzwingen, führt jedes Schaltjahr zu einem dreitägigen Zyklus und Ende Februar. Sie können die Tatsache nicht wirklich umgehen, dass ein regelmäßiges Muster für "jeden zweiten Tag" nicht immer auf gerade oder ungerade Tage in jedem Monat fällt, und auf jede Weise, die Sie dies erzwingen, wird es entweder einen zusätzlichen Lauf geben oder einen Lauf dazwischen verpassen Monate mit fehlgeschlagenen Tageszählungen.
0,2,4...,30,32,34
und es wäre egal, die Werte außerhalb des Bereichs würden einfach nie übereinstimmen.0 0 2-30/2 * * command
0 0 2-30/2 * * command
wie erwartet.Ich denke, eine Möglichkeit besteht darin, den Tag des Jahres wie folgt zu verwenden:
Es ist für Unix- und Linux-Systeme getestet.
quelle
test $(($(date +%j) % 2)) == 0 && command
test $(($(date +%s) / 86400 % 2)) == 0 && command
Lassen Sie uns jeden Tag überprüfen, ob es sich um ein "anderes" handelt :-) (
bc
Programm erforderlich)(Ich bin nicht sicher, ob der Code korrekt angezeigt wird. Der
date +%s
Teil befindet sich zwischen Hochkommas.)quelle
Im Allgemeinen würde ich es jeden Tag ausführen und das Skript mithilfe von Logik bestimmen lassen, ob es heute ausgeführt werden soll.
Eine einfache Statusdatei zu erstellen, die angibt, wann sie zuletzt ausgeführt wurde, und dann zu vergleichen, würde sehr leicht funktionieren.
Wenn es durch verschiedene Quellen ausgeführt werden muss, machen Sie es argumentabhängig.
quelle