Пять полей
Выражение cron — это пять полей через пробел, которые говорят планировщику, когда запускать задание:
По порядку, слева направо:
| Минута | 0-59 |
| Час | 0-23 |
| День месяца | 1-31 |
| Месяц | 1-12 |
| День недели | 0-6 (воскресенье = 0) |
Задание запускается, когда текущее время совпадает со всеми полями.
Специальные символы
*— любое значение.,— список:1,15— 1-е и 15-е число.-— диапазон:1-5в последнем поле — с понедельника по пятницу./— шаг:*/10в поле минут — каждые 10 минут.
Распространённые расписания
*/5 * * * * | Каждые 5 минут |
0 * * * * | Каждый час, ровно в начале часа |
0 0 * * * | Каждый день в полночь |
30 8 * * 1-5 | В 08:30 по будням |
0 0 1 * * | В полночь 1-го числа каждого месяца |
0 3 * * 0 | В 03:00 каждое воскресенье |
Вставьте любое выражение в Расшифровка выражений cron, чтобы прочитать его простыми словами и увидеть ближайшие запуски.
На чём часто ошибаются
- Часовой пояс: cron использует часы сервера, а они часто в UTC.
- День месяца и день недели вместе: если заданы оба, задание запускается, когда совпадает любое из них, а не оба.
- Секунды: в стандартном cron нет поля секунд. Некоторые системы, например Quartz и Spring, добавляют его в начало, и полей становится шесть.
Выражения, которые делают не то, что кажется
| Выражение | Задумано | На самом деле запускается |
|---|---|---|
0 9 1-7 * 1 | В 09:00 в первый понедельник | В 09:00 в каждый из дней с 1 по 7 и в каждый понедельник |
*/15 9-17 * * 1-5 | Каждые 15 минут с 9 до 17 | С 09:00 до 17:45 по будням, включая час с 17:00 |
0 0 31 * * | В последний день месяца | Только в семи месяцах, где 31 день |
0 0 29 2 * | Раз в год | Только в високосные годы |
Для первого понедельника запускайте в дни с 1 по 7 и проверяйте день недели внутри скрипта.
Сокращения
Многие версии cron принимают сокращения: @hourly, @daily, @weekly, @monthly, @yearly и @reboot, который запускается один раз при старте машины.
Летнее время
На сервере, живущем по местному времени, задача между 01:00 и 03:00 может пропуститься в ночь перевода часов вперёд или выполниться дважды при переводе назад, в зависимости от версии cron. Ставьте важные задачи вне этих часов или держите сервер в UTC.