Планировщик cron

Запускаем скрипты по расписанию: каждую ночь, каждый час, каждую минуту.

cron — это системный планировщик, который запускает заданные команды по расписанию; задания хранятся в таблице crontab.

Формат пяти полей

Каждая строка crontab — это пять полей расписания и команда. Поля задают минуту, час, день месяца, месяц и день недели.

┌───────── минута (0–59)
│ ┌─────── час (0–23)
│ │ ┌───── день месяца (1–31)
│ │ │ ┌─── месяц (1–12)
│ │ │ │ ┌─ день недели (0–7, 0 и 7 — воскресенье)
│ │ │ │ │
* * * * *  команда

Звёздочка означает «любое значение». Редактируют таблицу командой crontab -e, смотрят — crontab -l.

Примеры расписаний

# каждый день в 3:30 ночи
30 3 * * * /home/user/backup.sh

# каждый час в начале часа
0 * * * * /home/user/check-disk.sh

# каждые 15 минут
*/15 * * * * /home/user/ping.sh

# по будням в 9:00
0 9 * * 1-5 /home/user/report.sh

Запись */15 значит «каждые 15 единиц», 1-5 — диапазон (пн–пт), запятая перечисляет значения (0,30 — в 0 и 30 минут).

Логирование задач

cron работает в фоне, и вы не увидите вывод скрипта на экране. Поэтому вывод перенаправляют в лог:

0 2 * * * /home/user/backup.sh >> /var/log/backup.log 2>&1

Здесь и обычный вывод, и ошибки дописываются в лог-файл — потом по нему легко понять, что пошло не так.

Как работает под капотом

Демон cron раз в минуту просыпается и сверяет текущее время с расписаниями в crontab. Совпавшие задания он запускает в МИНИМАЛЬНОМ окружении: своя короткая PATH (часто только /usr/bin:/bin), нет ваших переменных из .bashrc, рабочая папка — домашняя. Поэтому скрипт, который прекрасно работает в терминале, в cron может «не найти» команду или файл.

Частые ошибки

  • Относительные пути. В cron рабочая папка иная — указывайте АБСОЛЮТНЫЕ пути и к скрипту, и к файлам внутри.
  • Урезанный PATH. Команда вроде docker может не найтись. Задайте PATH в начале crontab или вызывайте программы по полному пути.
  • Нет логирования. Без >> log 2>&1 вы не узнаете, почему задача упала.

Итог

  • cron-строка: пять полей (минута, час, день, месяц, день недели) и команда.
  • */N — каждые N единиц, A-B — диапазон, A,B — перечисление; редактирование через crontab -e.
  • cron даёт урезанное окружение: используйте абсолютные пути и логируйте через >> log 2>&1.
Проверьте себя
1. Сколько полей расписания в строке crontab перед командой?
A3
B4
C5
D6
2. Что означает расписание */15 * * * *?
AВ 15 часов каждый день
BКаждые 15 минут
C15-го числа каждого месяца
DКаждые 15 секунд
3. Почему скрипт, работающий в терминале, может упасть в cron?
Acron медленнее
Bcron запускает задачи в урезанном окружении: короткий PATH и иная рабочая папка
Ccron не поддерживает Bash
DИз-за прав root