CRON в первый рабочий день месяца
Да, ключевой момент тут именно в «рабочий день».
Задачка вроде не тривиальная, но как оказалось cron
нихуя не умеет определять рабочий сегодня день или нет. И systemd timer
тоже не умеет. Никто ничо блядь не умеет.
Мы с тобой не пальцем деланы, изобретем свой велосипед!
Чтобы реализовать желаемое, я изобрел такую кишку:
0 8 1-3 * * [ "$(date +\%u)" -lt 6 ] && [ "$(curl -s https://isdayoff.ru/$(date +\%Y\%m\%d))" = "0" ] && /usr/local/sbin/bashdays.sh
Выглядит монструозно, но блядь… Можно в сам скрипт проверку забить, но это еще один костыль.
Что тут происходит?
Короче…
0 8 1-3 * *
— Запуск 1–3 числа месяца в 08:00. Потому что первый рабочий день месяца может выпасть на 1-е число, если это будний день. 2-е число, если 1-е — выходной. 3-е число, если 1-е и 2-е — выходные (например, сб + вс).
[ "$(date +%u)" -lt 6 ]
— Проверяем, что сегодня будний день (1–5 = Пн–Пт). Пусть тебя здесь 6ка не смущает. Она означает: день меньше 6, т.е. 1, 2, 3, 4, 5 — это будни (Пн – Пт).
curl ... = "0"
— Проверка, что сегодня рабочий день по календарю РФ, выполняется через АПИху производственного календаря.
&& /opt/scripts/first-workday.sh
— Выполняем только если сошлись оба условия.
То есть АПИха возвращает 0
если сегодня будни. Если выходной, то оно вернет что-то другое.
Тут еще бы для curl
и date
указать что-то вроде CURL=$(which curl)
, а то крон частенько залупается и не знает откуда запускать эти команды.
Всегда старайся указывать полные пути до программ и утилит. Это распространенный кейс, крон вроде отрабатывает, но ничего не работает. А оно просто не знает откуда запускать, то что ты ему прописал.
Да, есть зависимость от внешнего API и порой это пиздец хуёва. Отвалилась АПИха, скрипт не получил данные. Поэтому рекомендую сделать себе собственный микросервис с АПИхой и ни от кого не зависеть. Тем более если сервер в оффлайне, запрос на внешнюю АПИху он сделать не сможет.
Если знаешь еще какие-то способы, велком в комментарии.