Chciałbym uruchomić pracę z cron o 8.30 w pierwszy poniedziałek każdego miesiąca. Strona Wikipedii cron mówi
Chociaż normalnie zadanie jest wykonywane, gdy wszystkie pola specyfikacji godziny / daty odpowiadają bieżącej godzinie i dacie, istnieje jeden wyjątek: jeśli zarówno „dzień miesiąca”, jak i „dzień tygodnia” są ograniczone (nie „*”), wówczas albo pole „dzień miesiąca” (3) lub pole „dzień tygodnia” (5) muszą być zgodne z bieżącym dniem.
(mój nacisk)
Czy to oznacza, że nie mogę zrobić pierwszego poniedziałku miesiąca, mogę zrobić tylko pierwszy (lub jakikolwiek inny) dzień miesiąca? Nie mogę wymyślić sposobu na obejście tego.
Odpowiedzi:
Możesz umieścić warunek w rzeczywistym poleceniu crontab:
Jeśli ten warunek jest spełniony przez jeden z pierwszych siedmiu dni w miesiącu, masz pierwszy poniedziałek. Zauważ, że w crontab składnia procentowa musi być zmieniona:
Zastąp
echo
polecenie rzeczywistym poleceniem, które chcesz uruchomić. Znalazłem też podobne podejście .źródło
[ "$(date '+%a')" = "Mon" ] && echo "It's Monday"
tak jak w wierszu poleceń.[ $(date '+%a') = "Mon" ] && echo "It's Monday"
Ale w crontab wydaje się, że zawodzi podczas tego testu. Nie mogę również uzyskać żadnej przydatnej informacji zwrotnej od crona: próbuję[ "$(date '+%a')" = "Tue" ] >> /home/deploy/cron.log 2>&1
przechwycić dane wyjściowe błędu w dzienniku, ale to też nie działa: /date
wyjściowe są prawidłowe? Na przykład po prostucron
uruchom polecenie, które wypisuje to do pliku:date '+%a' > ~/datetest 2>&1
- a następnie sprawdź, czy otrzymano odpowiedni ciąg znaków do porównania.+%a
potrzebnej ucieczki, gdy był w crontab, czyli linii musiał być to:[ "$(date '+\%a')" = "Mon" ] && echo "It's Monday"
. Gdybyś mógł zaktualizować swoją odpowiedź, byłoby to pomocne dla przyszłych czytelników :) Jeszcze raz dziękuję - maxMam komputer z językiem hiszpańskim, więc to podejście nie działa dla mnie, ponieważ mon zmienia się na lun
Inne języki również zawiodłyby, więc wprowadziłem niewielką zmianę w zaakceptowanej odpowiedzi, która usuwa barierę językową:
źródło
Jest mi łatwiej, kiedy nie ma potrzeby obsługi numerów dziennych.
Uruchom w pierwszy poniedziałek miesiąca:
tzn. jeśli miesiąc 1 tydzień temu nie jest taki sam jak bieżący miesiąc, to jesteśmy w pierwszym dniu 1 (= poniedziałek) miesiąca.
Podobnie w trzeci piątek
tj. jeśli miesiąc 3 tygodnie temu jest inny niż bieżący miesiąc, to jesteśmy w trzecim dniu 6 (= piątek) miesiąca
źródło
Zaplanowałem uruchomienie zadania w 4. poniedziałek każdego miesiąca o 16:00 w następujący sposób:
źródło
O ile mi wiadomo, NIE jest możliwe używanie tylko crontab, jednak można użyć funkcji otoki, aby wybrać właściwy dzień z wpisu „pierwsze siedem dni miesiąca”; zobacz to od wpisu.
Skrypt opakowania byłby
i musisz go uruchomić (zakładając, że nazywa się wrapper.sh i jest dostępny na całym świecie) przy użyciu wpisu crontab
źródło
W systemie Solaris 10 musiałem sformatować warunek w następujący sposób:
źródło
Możesz spróbować uruchomić cronjob przez pierwsze siedem dni miesiąca i pozwolić mu działać tylko w poniedziałek.
Powyżej powinno dla ciebie pracować.
źródło
Polecam użyć
zamiast
aby uniknąć problemu z lokalizacją.
źródło
Zrobiłem ogólne rozwiązanie dla tego rodzaju problemów, działa na pierwszy, drugi, trzeci ..... ostatni dzień tygodnia miesiąca.
Możesz użyć tego w następujący sposób:
Skrypt uruchom dzisiaj, jeśli sprawdza zarówno dzień tygodnia, jak i żądany zakres dat tygodnia, jeśli oba pasują, to zwraca 0, w przeciwnym razie 1.
Sprawdź kod tutaj. https://github.com/xr09/cron-last-sunday
źródło
Wierzę, że to rozwiązuje problem bardziej elegancko:
źródło
Ponieważ interpretuję moje instrukcje cron przy użyciu php i js, nie mogę używać bash. W końcu stwierdziłem, że jest to możliwe tylko z cronem:
Mam nadzieję, że to pomaga komuś innemu. Niezależnie od tego życzę wszystkim pięknego dnia. :-)
źródło
Będzie to działać w każdy poniedziałek każdego miesiąca.
źródło