Планировщик задач: 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)
Символ | Значение |
| любое значение |
| конкретное значение |
| каждые 15 единиц |
| диапазон (с 1 по 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