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

Быстрые варианты:
Конструктор:

cron выполняется в таймзоне сервера, а не вашего компьютера.
Ближайшие запуски

    Как устроено cron-выражение

    Строка crontab состоит из пяти полей, разделённых пробелами, и команды. Поля задают минуту, час, день месяца, месяц и день недели.

    минута0–59
    час0–23
    день месяца1–31
    месяц1–12 или JAN–DEC
    день недели0–7 (0 и 7 — воскресенье) или SUN–SAT

    В каждом поле работают четыре конструкции: * — любое значение, 5 — конкретное, 1-5 — диапазон, */15 — шаг. Их можно перечислять через запятую: 0,30.

    Частые расписания

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

    Таймзона сервера

    Cron берёт время операционной системы. Если сервер живёт в UTC, задача «в 03:00» выполнится в 06:00 по Москве. Текущую таймзону показывает timedatectl (или date), а задать её для конкретного crontab можно строкой CRON_TZ=Europe/Moscow в его начале — этот вариант поддерживают не все реализации, поэтому надёжнее приводить в порядок таймзону самого сервера. Подробнее про настройку — в статье «Crontab и incrontab: как настроить кроны».

    Перевод часов

    В зонах с переходом на летнее время одна ночь в году короче на час, а другая длиннее. Задача, назначенная на исчезающий час, не выполнится; задача в удвоенный час может выполниться дважды. В России переход отменён с 2014 года, но арендованный сервер часто стоит в европейской зоне — инструмент подсвечивает такие запуски.

    Частые вопросы

    В какой таймзоне работает cron?

    В таймзоне сервера, а не вашего компьютера. По умолчанию у большинства VPS это UTC.

    Что означает звёздочка со слешем, например */15?

    Это шаг: значение перебирается от начала диапазона с указанным интервалом. Запись */15 в поле минут даёт 0, 15, 30 и 45 минут каждого часа.

    Почему выражение 0 0 13 * FRI срабатывает чаще, чем в пятницу 13-го?

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

    Что произойдёт при переводе часов?

    При переходе на летнее время час пропадает, и задача не выполнится. При обратном переходе час повторяется, и задача может выполниться дважды.

    Работает ли @reboot?

    Не везде: часть реализаций и хостингов его не поддерживает. Для запуска при старте системы надёжнее systemd-юнит.

    Рядом по теме: supervisord для постоянно живущих процессов, полезные CLI-утилиты и другие инструменты.

    Нужна разработка или консультация?

    Опишите задачу — отвечу и предложу формат работы.

    Обсудить задачу