Разработка · 3 мин чтения ·
Выражения cron простыми словами: 10 готовых примеров
Пять полей, четыре символа и одна ловушка с часовыми поясами. Учимся читать и писать расписания cron на примерах, которые можно скопировать.

Cron — планировщик, который запускает резервные копии, отчёты и задачи очистки на серверах по всему миру, а его синтаксис используется и в GitHub Actions, CronJob в Kubernetes и большинстве облачных планировщиков. Расписание — это пять полей через пробел.
┌ минута (0-59)
│ ┌ час (0-23)
│ │ ┌ день месяца (1-31)
│ │ │ ┌ месяц (1-12)
│ │ │ │ ┌ день недели (0-6, 0 = воскресенье)
* * * * *
Четыре символа
* означает любое значение. Запятая задаёт список (1,15), дефис — диапазон (1-5), косая черта — шаг (*/15 = каждые 15 единиц). Этих четырёх хватает почти для любого расписания.
10 примеров
*/5 * * * * каждые 5 минут
0 * * * * каждый час, ровно в начале часа
0 9 * * * каждый день в 09:00
30 2 * * * каждую ночь в 02:30
0 9 * * 1-5 по будням в 09:00
0 18 * * 5 по пятницам в 18:00
0 0 1 * * в полночь 1-го числа каждого месяца
0 0 1 1 * раз в год, 1 января
0 */6 * * * каждые 6 часов
15 8,12,17 * * * каждый день в 08:15, 12:15 и 17:15
Ловушка 1: день месяца и день недели
Если ограничены оба поля, классический cron запускает задачу, когда совпадает любое из них. 0 0 1 * 1 сработает 1-го числа каждого месяца и ещё каждый понедельник, а не только в понедельники, выпавшие на 1-е число.
Ловушка 2: часовой пояс
У cron нет своего часового пояса. Задача выполняется по времени машины или сервиса, который её запускает, а это часто UTC. Задача 0 9 * * * на сервере в UTC сработает в 09:00 UTC, а у вас это может быть на несколько часов раньше или позже, к тому же переход на летнее время может сдвинуть её ещё раз.
Ловушка 3: наложение и пропуск запусков
Cron запускает задачу по расписанию независимо от того, закончился ли предыдущий запуск. Резервное копирование раз в 5 минут, которое длится 7 минут, в итоге работает в двух экземплярах одновременно. Оборачивайте долгие задачи в блокировку (в Linux это делает flock одной строкой) или делайте их безопасными для параллельного запуска. Cron также ничего не наверстывает: если в 02:30 машина выключена, задача на 02:30 этой ночью просто не выполнится.
*/5 * * * * flock -n /tmp/backup.lock /usr/local/bin/backup.sh
Сокращения и мелкие различия
Многие реализации cron понимают сокращения @hourly, @daily, @weekly, @monthly и @reboot вместо пяти полей. В большинстве из них воскресенье можно записать как 0 или 7, а также разрешены имена вроде MON или JAN. Платформы различаются в деталях, поэтому сверяйтесь с документацией системы, которая будет запускать задачу, особенно в управляемых облачных планировщиках.
Куда уходит вывод?
По умолчанию cron отправляет вывод задачи письмом локальному пользователю, а на большинстве серверов это значит, что он просто пропадает. Перенаправьте вывод в лог-файл или в вашу систему логирования, чтобы упавшая задача оставила след:
30 2 * * * /usr/local/bin/report.sh >> /var/log/report.log 2>&1
Проверьте перед деплоем
Вставьте выражение в расшифровщик cron-выражений от 4Dev, и он перескажет расписание простыми словами. Поддерживается стандартный формат из пяти полей; выражения из шести или семи полей с секундами или годами, как в Quartz или Spring, отклоняются с ошибкой.