bitlvl
RU

Разбор cron-выражений

Введите пять полей записи crontab. Вы получите расписание простыми словами и следующие десять моментов, когда оно сработает, в выбранном вами часовом поясе.

Результаты и сообщения этого инструмента выводятся на английском языке.

Синтаксис crontab

┌───────────── минута         0–59
│ ┌─────────── час            0–23
│ │ ┌───────── день месяца    1–31
│ │ │ ┌─────── месяц          1–12  или jan–dec
│ │ │ │ ┌───── день недели    0–7   или sun–sat  (0 и 7 — воскресенье)
│ │ │ │ │
* * * * *  команда для запуска
СинтаксисЗначениеПример
*Любое значение* * * * *каждую минуту
5Ровно это значение5 0 * * *ежедневно в 00:05
1-5Диапазон0 9 * * 1-509:00 по будням
*/15Каждое n-е значение*/15 * * * *каждые 15 минут
1,15Список0 0 1,15 * *полночь 1-го и 15-го числа
8-18/2Шаг внутри диапазона0 8-18/2 * * *каждые 2 часа с 08:00 до 18:00
@dailyМакрос@dailyто же, что 0 0 * * *

Ловушка «день месяца / день недели»

Если ограничены и поле дня месяца, и поле дня недели, стандартный cron запускает задание, когда совпадает любое из них, а не оба. 0 0 13 * 5 срабатывает каждое 13-е число и каждую пятницу, а не только в пятницу 13-го. Инструмент помечает этот случай.

Часовые пояса и летнее время

Cron работает в системном часовом поясе машины (или по переменной CRON_TZ / TZ, где она поддерживается). В ночь перевода часов вперёд задание, запланированное на 02:30, может не выполниться вовсе; при переводе назад оно может выполниться дважды. Задания, которые должны выполняться ровно раз в сутки, безопаснее всего ставить между 03:00 и 23:00 или в UTC. Список запусков выше использует реальные календарные правила выбранного пояса, так что ночь перехода можно проверить напрямую.

Что ещё стоит знать

  • Разрешение cron — одна минута. Для секунд используйте таймер systemd или цикл внутри задания.
  • Окружение минимально: задайте PATH в crontab или используйте абсолютные пути и перенаправляйте вывод, иначе он придёт вам по почте.
  • % в поле команды означает перевод строки, если не экранирован как \%, — это ломает date +%F.
  • Выражения из шести полей с колонкой секунд — это синтаксис Quartz/Spring, а нестандартные L, W и # тоже из Quartz. Обычный crontab их не принимает.

Вопросы

Как запускать задание cron каждые 5 минут?

*/5 * * * *. Каждые 5 минут только в рабочее время: */5 9-17 * * 1-5.

Как запускать что-то каждый день в полночь?

0 0 * * * или макрос @daily. Для 00:30 используйте 30 0 * * *.

Как запланировать запуск в последний день месяца?

Стандартный cron не может выразить это напрямую. Запускайте с 28-го по 31-е и пусть скрипт проверяет, является ли завтра 1-е число: 0 0 28-31 * * [ "$(date -d tomorrow +%d)" = "01" ] && /path/to/job.

Воскресенье — это день недели 0 или 7?

И то, и другое. В большинстве реализаций cron 0 и 7 — воскресенье; понедельник — 1. Имена (sun, mon) тоже принимаются, и в них труднее ошибиться.

Почему моё задание запустилось не в то время?

Почти всегда дело в часовом поясе: сервер работает в UTC, а вы ожидали местное время, или наоборот. Проверьте командой date на сервере или задайте CRON_TZ=Europe/Belgrade в начале crontab, где это поддерживается (cronie, Vixie cron).

В чём разница между cron и таймерами systemd?

Таймеры могут работать по календарным выражениям с секундами, навёрстывать пропущенные запуски после перезагрузки (Persistent=true), писать в журнал и зависеть от других юнитов. Cron проще и универсальнее. Для обычных плановых заданий подходят оба.