Дата и время

Как читать и писать выражения cron: пять полей и типичные примеры

Резервная копия каждый день в 2 часа ночи, отчёт в 9 утра по будням, проверка состояния каждые десять минут — здесь всё, что нужно для настройки периодических заданий в cron.

Пять полей

Стандартное выражение cron в Unix состоит из пяти полей, разделённых пробелами: минута (0–59), час (0–23), день месяца (1–31), месяц (1–12) и день недели (0–7, где 0 и 7 — воскресенье). Задание запускается, когда совпадают все поля.

Например, 0 2 * * * означает: минута 0, час 2, каждый день, каждый месяц, любой день недели — то есть ежедневно в 2:00. Звёздочка означает «любое значение».

┌───── минута (0-59)
│ ┌─── час (0-23)
│ │ ┌─ день месяца (1-31)
│ │ │ ┌ месяц (1-12)
│ │ │ │ ┌ день недели (0-7, вс=0 или 7)
│ │ │ │ │
0 2 * * *

Четыре специальных символа

Комбинации этих четырёх символов хватает для большинства расписаний. Некоторые системы также принимают названия вроде MON и JAN.

  • * (любое): * в поле часа означает каждый час.
  • , (список): 1,15 означает 1-е и 15-е число.
  • - (диапазон): 1-5 в поле дня недели означает с понедельника по пятницу.
  • / (шаг): */10 в поле минут означает 0, 10, 20… — каждые десять минут. Можно указать и начало, например 5-59/15.

Типичные примеры

Написав выражение, вычислите несколько ближайших запусков, чтобы убедиться, что оно делает то, что нужно. Помните, что шаг отсчитывается от нуля, а не от момента запуска задания: */45 в поле минут срабатывает в :00 и :45 каждого часа, а не каждые 45 минут.

*/5 * * * *      каждые 5 минут
0 * * * *        каждый час ровно
30 9 * * 1-5     в 09:30 по будням
0 0 1 * *        в полночь 1-го числа каждого месяца
0 18 * * 5       в 18:00 каждую пятницу
0 3 * * 0        в 03:00 каждое воскресенье
0 9,18 * * *     ежедневно в 09:00 и 18:00
0 0 1 1 *        в полночь 1 января

Типичные ловушки

Самая известная ловушка — одновременно задать день месяца и день недели. 0 0 13 * 5 выглядит как «пятница, 13-е», но в стандартном cron, если ни одно из полей не равно *, они объединяются через ИЛИ: задание запускается 13-го числа каждого месяца и в каждую пятницу.

Вторая — «последний день месяца». В стандартном пятипольном cron для этого нет символа; распространённый обходной путь — запускать задание 28–31 числа, а в скрипте проверять, не первое ли завтра число. Некоторые планировщики, например Quartz, поддерживают L, но используют формат из шести или семи полей с секундами, несовместимый со стандартным cron.

Какой часовой пояс использует cron?

Cron следует системному часовому поясу сервера. Большинство облачных серверов работают в UTC, поэтому отчёт, задуманный на 9 утра по Москве, может уйти в полдень по московскому времени. 9:00 по Москве — это 6:00 UTC, так что на сервере в UTC нужно писать 0 6 * * *.

GitHub Actions и Kubernetes CronJob по умолчанию тоже используют UTC. Если расписание привязано к региону с летним временем, учитывайте, что местное время запуска дважды в год будет сдвигаться на час.

Советы по эксплуатации

В генераторе cron от AIBIZAP достаточно выбрать «ежедневно» или «еженедельно», и выражение будет составлено за вас — расписание получится правильным без заучивания синтаксиса.

  • Распределяйте тяжёлые задания по минутам вроде :07 или :23, а не запускайте всё в :00.
  • Если запуск может не завершиться до начала следующего, добавьте блокировку, чтобы избежать наложения.
  • Окружение и PATH у cron отличаются от интерактивной оболочки, поэтому в скриптах используйте абсолютные пути.
  • Записывайте вывод каждого запуска в лог, чтобы ни один сбой не остался незамеченным.

Попробуйте с этими инструментами

Другие руководства

Все руководства