Строка 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 года, но арендованный сервер часто стоит в европейской зоне — инструмент подсвечивает такие запуски.
В таймзоне сервера, а не вашего компьютера. По умолчанию у большинства VPS это UTC.
*/15?Это шаг: значение перебирается от начала диапазона с указанным интервалом. Запись */15 в поле минут даёт 0, 15, 30 и 45 минут каждого часа.
0 0 13 * FRI срабатывает чаще, чем в пятницу 13-го?Если ограничены и день месяца, и день недели, cron выполняет задачу при совпадении любого из этих условий: и 13-го числа любого месяца, и в каждую пятницу. «Пятницу 13-го» одним выражением задать нельзя — нужна проверка даты внутри скрипта.
При переходе на летнее время час пропадает, и задача не выполнится. При обратном переходе час повторяется, и задача может выполниться дважды.
@reboot?Не везде: часть реализаций и хостингов его не поддерживает. Для запуска при старте системы надёжнее systemd-юнит.
Рядом по теме: supervisord для постоянно живущих процессов, полезные CLI-утилиты и другие инструменты.
Опишите задачу — отвечу и предложу формат работы.
Обсудить задачу