Wypróbowana składnia jest w rzeczywistości niejednoznaczna. W zależności od liczby dni w miesiącu, niektóre miesiące będą działać w dni nieparzyste, a niektóre w parzyste. Wynika to z tego, że sposób jego obliczenia bierze całkowitą liczbę możliwości i dzieli je. Możesz prześcignąć to zachowanie polegające na stosowaniu strategii, ręcznie określając zakres dni i używając nieparzystej lub parzystej liczby dni. Ponieważ skrypty parzyste nigdy nie uruchomią się w 31 dniu dłuższych miesięcy, nie tracisz niczego, używając 30 dni jako podstawy dla dni parzystych, a określając konkretnie podział, tak jakby były 31 dni, możesz wymusić nieparzyste -dniowa egzekucja.
Składnia wyglądałaby następująco:
# Will only run on odd days:
0 0 1-31/2 * * command
# Will only run on even days:
0 0 2-30/2 * * command
Twoja obawa, że miesiące nie będą miały takiej samej liczby dni, nie jest tutaj ważna, ponieważ żaden miesiąc nie ma WIĘCEJ dni niż ten, a dla biednego lutego zakres dat po prostu nigdy nie będzie pasował do ostatniego dnia lub dwóch, ale nie zaszkodzi to, że to wymienione.
Jedyną „gotcha” dla tego podejścia jest to, że jeśli jesteś w cyklu dnia nieparzystego, w następnych miesiącach z 31 dniami twoje polecenie będzie również działać pierwszego dnia miesiąca. Podobnie, jeśli wymuszasz cykl parzysty, każdy rok przestępny spowoduje jeden trzydniowy cykl i koniec lutego. Naprawdę nie można ominąć faktu, że jakikolwiek regularny wzorzec „co drugi dzień” nie zawsze będzie padał w parzyste lub nieparzyste dni w każdym miesiącu i w jakikolwiek sposób wymusisz to albo będziesz miał dodatkowy bieg, albo będzie go brakować między liczą się miesiące z niedopasowanym dniem.
0,2,4...,30,32,34
i to nie będzie miało znaczenia, wartości spoza zakresu po prostu nigdy nie zostaną dopasowane.0 0 2-30/2 * * command
0 0 2-30/2 * * command
działa zgodnie z oczekiwaniami.Myślę, że istnieje możliwość wykorzystania dnia roku, takiego jak ten:
Jest testowany dla systemów Unix i Linux.
źródło
test $(($(date +%j) % 2)) == 0 && command
test $(($(date +%s) / 86400 % 2)) == 0 && command
Sprawdzajmy codziennie, czy jest to „inny” :-) (
bc
wymagany program)(Nie jestem pewien, czy kod pojawia się poprawnie.
date +%s
Część jest między apostrofami wstecznymi).źródło
Ogólnie rzecz biorąc, uruchamiałbym go codziennie, a skrypt powinien użyć logiki, aby ustalić, czy należy go uruchomić dzisiaj.
Utworzenie prostego pliku statusu z informacją o ostatnim uruchomieniu, a następnie kompilacji, działałoby bardzo łatwo.
Jeśli trzeba go uruchamiać z różnych źródeł, uzależnij go od argumentów.
źródło