Планировщик задач: cron и crontab

Планировщик задач cron в Linux: crontab -e, синтаксис расписания, примеры задач, @reboot и логирование — автоматизация повторяющихся команд.

cron — демон-планировщик, который выполняет команды по расписанию. crontab — файл с расписанием конкретного пользователя.

Редактирование crontab

# Открыть расписание текущего пользователя
crontab -e

# Посмотреть текущее расписание (без редактирования)
crontab -l

# Удалить всё расписание
crontab -r

# Редактировать расписание другого пользователя (от root)
sudo crontab -u alice -e

Синтаксис строки crontab

# Формат:
# минута  час  день_месяца  месяц  день_недели  команда
#  (0-59) (0-23)  (1-31)   (1-12)    (0-7)

Символ

Значение

*

любое значение

5

конкретное значение

*/15

каждые 15 единиц

1-5

диапазон (с 1 по 5)

1,3,5

перечисление

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

# Каждый день в 02:30 — создать резервную копию
30 2 * * * /home/alice/scripts/backup.sh

# Каждые 15 минут — проверить сайт
*/15 * * * * curl -s https://mysite.com > /dev/null

# По понедельникам в 09:00 — отправить отчёт (день недели: 1=Пн)
0 9 * * 1 /home/alice/scripts/weekly-report.sh

# 1-го числа каждого месяца в полночь — очистить логи
0 0 1 * * /usr/local/bin/clean-logs.sh

# Каждый будний день (Пн-Пт) в 18:00
0 18 * * 1-5 /home/alice/scripts/eod-task.sh

Специальные строки

# При каждой загрузке системы
@reboot /home/alice/scripts/startup.sh

# Раз в день (в полночь) — то же что 0 0 * * *
@daily /usr/local/bin/cleanup.sh

# Раз в час
@hourly /usr/local/bin/check-disk.sh

@reboot — удобный способ запустить скрипт при старте системы без написания systemd-юнита.

Переменные и вывод в лог

# В начале crontab можно задать переменные
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
[email protected]   # письмо при ошибке (если настроен sendmail)

# Перенаправить вывод и ошибки в лог
0 2 * * * /home/alice/backup.sh >> /var/log/backup.log 2>&1

Конструкция >> лог 2>&1 добавляет stdout и stderr в файл лога. Без неё вывод cron-задачи теряется.

Системный crontab

# Системный файл расписания (для root-задач)
cat /etc/crontab

# Каталоги с задачами по периоду
ls /etc/cron.daily/
ls /etc/cron.weekly/
ls /etc/cron.monthly/

Поместите исполняемый скрипт в /etc/cron.daily/ — он запустится автоматически раз в день без редактирования crontab.

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

  • Команда не найдена — cron запускается с минимальным PATH. Указывайте полные пути к командам или задайте PATH в начале crontab.
  • Скрипт не исполняемый — забыли chmod +x script.sh.
  • Нет вывода в лог — без >> лог 2>&1 понять причину ошибки невозможно.
  • Путь к файлу относительный — cron запускает задачи из /, не из домашнего каталога; используйте абсолютные пути.

Коротко

  • crontab -e — редактировать расписание; crontab -l — посмотреть.
  • Формат: мин час день месяц день_недели команда; * — любое значение.
  • */15 — каждые 15 единиц; 1-5 — диапазон; 1,3,5 — список.
  • @reboot — при загрузке; @daily, @hourly — удобные псевдонимы.
  • Всегда перенаправляйте вывод в лог: >> /var/log/task.log 2>&1.
Проверьте себя
1. Что означает запись */15 в поле минут crontab?
AВ 15-ю минуту каждого часа
BКаждые 15 минут
CС 1-й по 15-ю минуту
DКаждые 15 часов
2. Какая строка crontab запускает скрипт каждый день в 03:00?
A3 0 * * * /path/to/script.sh
B0 3 * * * /path/to/script.sh
C* 3 * * * /path/to/script.sh
D0 0 3 * * /path/to/script.sh
3. Почему в crontab-задачах рекомендуют перенаправлять вывод в лог?
AБез этого задача не запустится
BИначе вывод теряется и при ошибке невозможно понять причину
CЭто ускоряет выполнение
Dcron сам сохраняет логи в /var/log/cron
Поддержать проект