Синтаксис 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-5 | 09: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 проще и универсальнее. Для обычных плановых заданий подходят оба.