Cron-выражения: шпаргалка с примерами, которую не стыдно добавить в закладки
Синтаксис cron-выражения за 30 секунд
Каждая cron-строка — это 5 полей, разделённых пробелами:
┌──────────── минуты (0–59)
│ ┌────────── часы (0–23)
│ │ ┌──────── день месяца (1–31)
│ │ │ ┌────── месяц (1–12, или jan–dec)
│ │ │ │ ┌──── день недели (0–7, где 0 и 7 = вс, или sun–sat)
│ │ │ │ │
* * * * *Звёздочка * означает «каждый возможный». Пример: 30 2 * * * — запуск в 2:30 ночи каждый день.
🔑 В /etc/crontab и системных crontab перед полем минуты добавляется имя пользователя: например, 30 2 * * * root kommanda.Специальные символы: / , - и их комбинации
- запятая — перечисление:
1,15,30 * * * *— на 1-й, 15-й и 30-й минуте каждого часа. - дефис — диапазон:
9-17 * * * *— каждый час с 9 до 17 (включительно). - звёздочка — все допустимые значения.
- слеш — шаг:
*/5 * * * *— каждые 5 минут. Можно комбинировать:10-30/5 * * * *— каждые 5 минут с 10-й по 30-ю.
Также существуют макросы (нестандартные, но поддерживаемые многими системами):
| Макрос | Эквивалент | Пояснение |
|---|---|---|
| @yearly | 0 0 1 1 * | 1 января в 00:00 |
| @monthly | 0 0 1 * * | Первого числа каждого месяца |
| @weekly | 0 0 * * 0 | Каждое воскресенье в 00:00 |
| @daily | 0 0 * * * | Каждый день в 00:00 |
| @hourly | 0 * * * * | В начале каждого часа |
🛠 Удобный инструмент: Cron генератор онлайн — визуально строите расписание и сразу копируете готовую строку.
Рабочие примеры: от простого к сложному
Каждые 15 минут: */15 * * * *
Каждый час в рабочие дни (пн–пт): 0 * * * 1-5
Первый понедельник каждого месяца: Крайне сложно вручную, но помните: день недели и день месяца — это ИЛИ, а не И. Поэтому 0 0 1-7 * 1 (1-7 дни месяца ИЛИ пн) — неверно. Правильное решение — использовать скрипт-проверку в команде.
Каждое полугодие 1 марта и 1 сентября: 0 0 1 3,9 *
В 23:00 каждую пятницу 13-го: Невыразимо одной cron-строкой без дополнительной логики из-за конфликта двух полей. Используйте 0 23 13 * 5 /path/to/check_if_friday.sh, где скрипт проверяет, является ли 13-е пятницей, и если да — выполняет задачу.
Подводные камни и частые ошибки
- Дни недели и дни месяца — OR, а не AND.
0 0 13 * 5означает «каждую пятницу ИЛИ каждое 13-е число». Чтобы получить оба условия одновременно — используйте скрипт. - Переход на летнее время. Задачи, запланированные на 2:30, могут не выполниться в день перевода часов. Решение — использовать UTC в cron.
- Символ % обрабатывается специально. Внутри команды cron преобразует
%в новую строку. Экранируйте обратной косой чертой. - Пробелы в путях. Если путь содержит пробелы — заключайте его в двойные кавычки.
- Права и окружение. Cron выполняется с минимальными переменными окружения. Для сложных скриптов загружайте профиль в начале:
source ~/.bashrcили задавайтеHOMEиPATHявно.
❗ Всегда проверяйте cron-строку на онлайн-симуляторе перед добавлением в продакшен. Используйте Калькулятор времени выполнения cron-задач — он покажет ближайшие 10 дат выполнения.
✅ Чек-лист: проверка корректности cron-задачи
0 из 10
Как отладить cron, если задача не работает
Пошаговая диагностика:
- Проверьте, запущен ли cron-демон:
systemctl status cron(илиservice cron status). - Проверьте crontab:
crontab -l(текущий пользователь) илиsudo crontab -l(root). - Посмотрите логи:
grep CRON /var/log/syslog(или/var/log/cron). - Выполните команду вручную из терминала — работает ли она сама?
- Убедитесь, что полный путь к исполняемому файлу указан в cron (используйте
which). - Проверьте права файла скрипта:
chmod +x /путь/к/скрипту. - Перенаправьте вывод:
*/5 * * * * /my/script.sh >> /tmp/cron.log 2>&1 - Убедитесь, что синтаксис cron правильный с помощью онлайн-генератора.
Ещё один трюк: добавьте задачу с * * * * * (каждую минуту) и запишите что-то очевидное — если лог не обновляется, проблема в демоне или правах.
Практические сценарии: бэкапы, логи, уведомления
Ежедневный бэкап базы данных в 3 утра:
0 3 * * * pg_dump -U username dbname > /backups/db_$(date +\%Y\%m\%d).sqlОчистка логов старше 30 дней каждую первую субботу:
0 6 1-7 * 6 find /var/log/myapp/*.log -mtime +30 -deleteУведомление в Telegram при перезагрузке сервера:
@reboot /usr/bin/curl -s "https://api.telegram.org/botTOKEN/sendMessage?chat_id=CHATID&text=Server+rebooted"Макрос @reboot запускается при старте системы — удобно для проверки статуса.
🧮 Посчитайте сами — инструменты по теме
Частые вопросы
Что значит * * * * * в cron?
Это означает «каждую минуту, каждый час, каждый день, каждый месяц, каждый день недели» — то есть задача выполняется каждую минуту.
Как задать cron каждые 30 минут?
Используйте */30 * * * * — это запуск в 0 и 30 минут каждого часа.
Как в cron задать выполнение с понедельника по пятницу в 9 утра?
Запись: 0 9 * * 1-5 (минута 0, час 9, любой день месяца, любой месяц, дни недели 1-5).
Почему моя cron-задача не выполняется?
Причин много: демон остановлен, нет прав на скрипт, неправильный синтаксис, путь к исполняемому файлу не полный, ошибка в команде. Используйте логи и перенаправление вывода для диагностики.
Можно ли задать cron каждые 10 секунд?
Стандартный cron не поддерживает секунды; минимальный интервал — 1 минута. Для интервалов короче используйте systemd.timer или написать скрипт с sleep 10 внутри задачи, запущенной каждую минуту.
Что такое @reboot в cron?
Это специальный макрос (не во всех системах), который запускает задачу при старте системы. Поместите @reboot путь/к/скрипту в crontab.
Как удалить все cron-задачи пользователя?
Выполните crontab -r (с осторожностью). Можно также закомментировать строки, добавив # в начало.
Как проверить, когда в следующий раз выполнится cron-задача?
Используйте онлайн-калькулятор или утилиту cronnext (если установлена). Также можно посмотреть в логи после запуска.
Источники и нормативные документы
- crontab man page (Linux man-pages)
- Cron documentation — Arch Linux Wiki
- Crontab.guru — The cron schedule expression editor