Разработка · 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, отклоняются с ошибкой.

Открыть расшифровщик cron-выражений

LinkedInXFacebook