Расшифровка cron-выражений

Переводим расписание cron на русский, показываем ближайшие запуски в часовом поясе сервера и называем ловушки: день месяца против дня недели, минуты со звёздочкой, числа, которых нет в феврале. Можно вставить crontab целиком.

Примеры:

Cron выполняет задачи по часам сервера, а не по вашим. Выберите пояс, в котором живёт сервер, и запуски покажутся в нём. Ничего не отправляется: всё считается в браузере.

Что показывает инструмент

Пять полей cron превращаются во фразу: «каждые 15 минут с 09:00 до 18:59 по будням». Ниже — ближайшие запуски с датой, днём недели и сроком «через 3 дня», число запусков за год и список ловушек, если они есть.

Понимаются макросы @daily, @weekly и другие, имена месяцев и дней недели, шесть полей с секундами и знаки L, W, # из Quartz и Spring. Если вставить crontab целиком, расшифруется каждая строка, а переменные MAILTO, PATH и CRON_TZ будут учтены.

Нюансы, из-за которых задачи идут не так

Cron прощает многое, и расписание запускается не тогда, когда задумано. Самые частые случаи мы называем прямо.

  • День месяца и день недели заданы оба. Cron связывает их через «или»: 0 9 1-7 * 1 — это не первый понедельник месяца, а числа с 1-го по 7-е и каждый понедельник впридачу.
  • Минуты со звёздочкой при заданном часе: * 3 * * * — 60 запусков подряд с 03:00 до 03:59, а не один в три ночи.
  • Шаг, не делящий час нацело: */7 в минутах даёт 0, 7, 14… 56, а потом снова 0 — промежуток в четыре минуты вместо семи.
  • 31-е число в феврале, апреле, июне, сентябре и ноябре не наступает, 30 февраля не наступает никогда, 29 февраля бывает раз в четыре года.

Часовой пояс сервера

Cron выполняет задачи по часам машины, на которой стоит, а не по часам того, кто смотрит. Выберите пояс сервера, и запуски покажутся в нём: все российские пояса, UTC и соседние страны.

В поясах с переводом часов расписание может попасть в час, которого в этот день нет, или в час, который есть дважды. Такие даты отмечаются отдельно: разные реализации cron ведут себя в них по-разному.

Проверка команд

Если в строке есть команда, проверяется и она. Знак % в cron обрывает команду: date +%F так не сработает. Без перенаправления вывода всё, что команда печатает, уходит письмом. У cron короткий PATH, и команда без полного пути может не найтись. sudo внутри crontab повиснет на запросе пароля.

Другие инструменты