Cron в Linux: как устроено расписание задач
Cron — служба Linux, которая сама запускает команды и скрипты по расписанию: каждую ночь, каждый час или раз в месяц. Разберём, как читать и писать строки расписания и где они хранятся на сервере.
Содержание 12
- Что такое cron и crontab
- Из чего состоит строка расписания
- Звёздочка, диапазон, список и шаг
- День месяца и день недели вместе
- Короткие записи: @daily, @reboot и другие
- Где хранятся расписания
- Как cron запускает команду
- Переменные в расписании
- Как узнать, что задача сработала
- Ошибки и как их исправить
- Источники
- Что почитать дальше
Что такое cron и crontab
Cron — программа, которая работает на сервере в фоне и раз в минуту сверяется с расписаниями. Если время задачи пришло, cron запускает её команду. Так делают резервные копии, чистят старые файлы и выполняют задачи сайта по времени.
Расписание называют crontab — от английского cron table, «таблица cron». Своё расписание есть у каждого пользователя сервера, открывает его команда crontab -e. Как добавить задачу пошагово — в инструкции Как добавить задачу в cron.
В Ubuntu cron ставится пакетом cron. Если команды crontab на сервере нет, установите его:
sudo apt install cronИз чего состоит строка расписания
Одна строка — одна задача. В начале пять полей времени через пробел, за ними — команда:
30 3 * * * /home/ivan/backup.sh| Поле | Что задаёт | Значения |
|---|---|---|
| 1 | Минута | 0–59 |
| 2 | Час | 0–23 |
| 3 | День месяца | 1–31 |
| 4 | Месяц | 1–12 или jan, feb … dec |
| 5 | День недели | 0–7 (0 и 7 — воскресенье) или sun, mon … sat |
| Дальше | Команда | Всё до конца строки |
Строка из примера читается так: в 30 минут, в 3 часа, в любой день месяца, в любой месяц, в любой день недели — то есть каждый день в 3:30 — запустить скрипт /home/ivan/backup.sh.
Время — по часам сервера, а не вашего компьютера. Часовой пояс сервера покажет команда timedatectl, текущее время — date.
Строки, которые начинаются с #, — комментарии, cron их пропускает. Комментарий пишите на отдельной строке: текст после команды на той же строке cron считает частью команды.
Звёздочка, диапазон, список и шаг
| Запись | Что значит | Пример в поле часа |
|---|---|---|
* | Любое значение | * — каждый час |
a-b | Диапазон, оба края включены | 9-18 — с 9 до 18 часов |
a,b,c | Список значений | 8,20 — в 8 и в 20 часов |
*/n | Каждое n-е значение с начала | */6 — в 0, 6, 12 и 18 часов |
a-b/n | Каждое n-е значение в диапазоне | 9-17/2 — в 9, 11, 13, 15 и 17 часов |
Диапазоны и списки можно смешивать: 1-5,10 в поле дня месяца — с 1-го по 5-е и 10-е число.
Названия месяцев и дней недели пишут первыми тремя английскими буквами, регистр не важен: mon, Jan. Справка запрещает диапазоны и списки из названий, поэтому «с понедельника по пятницу» пишите числами: 1-5.
Шаг отсчитывается от начала диапазона, а не от прошлого запуска. */7 в поле минут — это 0, 7, 14 … 56 минут, а следующий запуск — снова в 0 минут, через 4 минуты. Ровные интервалы получаются, когда шаг делит 60 без остатка: 5, 10, 15, 20 или 30 минут. Для часов — делит 24: 2, 3, 4, 6, 8 или 12.
День месяца и день недели вместе
Если в строке заданы оба поля — и день месяца, и день недели, — задача запустится, когда совпадёт любое из них:
0 9 1 * 1 /home/ivan/report.shЭта строка сработает 1-го числа каждого месяца и в каждый понедельник, а не только в понедельник, который выпал на 1-е. Если одно из двух полей — звёздочка, учитывается только другое. Как задать «понедельник 1-го числа» — в статье Расписание cron: готовые примеры.
Короткие записи: @daily, @reboot и другие
Вместо пяти полей можно написать одно слово с @:
| Запись | Когда запускает | То же пятью полями |
|---|---|---|
@reboot | Один раз при загрузке сервера | — |
@hourly | Каждый час в 0 минут | 0 |
@daily или @midnight | Каждый день в 0:00 | 0 0 * |
@weekly | По воскресеньям в 0:00 | 0 0 0 |
@monthly | 1-го числа в 0:00 | 0 0 1 |
@yearly или @annually | 1 января в 0:00 | 0 0 1 1 * |
@daily /home/ivan/cleanup.sh@reboot срабатывает, когда cron стартует при загрузке сервера. Другие службы — например, база данных — к этому моменту могут ещё не запуститься. Если скрипту они нужны, начните его с паузы sleep 60. При перезапуске самой службы cron задачи @reboot не повторяются.
Где хранятся расписания
| Где | Чьё | Как править |
|---|---|---|
| Расписание пользователя | У каждого пользователя своё | crontab -e |
| Расписание root | Администратора сервера | sudo crontab -e |
Файл /etc/crontab | Системное | В редакторе через sudo |
Папка /etc/cron.d | Расписания программ и ваши файлы | В редакторе через sudo |
Папки /etc/cron.hourly, cron.daily, cron.weekly, cron.monthly | Скрипты без своего расписания | Положить туда исполняемый скрипт |
Расписания пользователей хранятся в папке /var/spool/cron/crontabs, но править эти файлы напрямую нельзя — только командой crontab: она проверяет строки перед сохранением.
В /etc/crontab и в файлах папки /etc/cron.d после пяти полей времени идёт имя пользователя, от которого запускать команду:
30 3 * * * root /root/backup-site.shВ расписании из crontab -e имени пользователя нет: задачи выполняются от имени его владельца. Если написать имя и там, cron примет его за начало команды.
Файлы в /etc/cron.d должны принадлежать root, менять их может только владелец. В имени файла допустимы латинские буквы, цифры, дефис и подчёркивание — файл с точкой, например backup.conf, cron пропустит. Те же правила имён действуют для скриптов в /etc/cron.daily и соседних папках, а ещё эти скрипты должны быть исполняемыми — с правом x (что это).
Как cron запускает команду
Задача выполняется не так, как команда в вашем терминале. Отсюда большая часть проблем с cron:
- Команду выполняет оболочка sh, а не bash. То, что есть только в bash, в строке расписания не сработает — вынесите такие команды в скрипт с первой строкой
#!/bin/bash. - Настройки из файлов .bashrc и .profile на задачи не действуют. Пишите полные пути к программам:
/usr/bin/php, а неphp. Где лежит программа, покажет командаwhich php. - Задача стартует в домашней папке пользователя. Путь вида
backup/db.sqlотсчитывается от неё — надёжнее писать полный путь. - Знак
%в команде cron превращает в перевод строки. Если он нужен, например в команде date, поставьте перед ним обратную косую черту:date +\%F. - Всё, что команда выводит, cron отправляет письмом владельцу расписания. Если почта на сервере не настроена, вывод пропадает, а в журнале появляется строка No MTA installed, discarding output. Поэтому вывод перенаправляют в файл:
>> /home/ivan/backup.log 2>&1.
Переменные в расписании
В начале расписания можно задать переменные — они действуют на строки ниже:
MAILTO=""
SHELL=/bin/bash
30 3 * * * /home/ivan/backup.sh >> /home/ivan/backup.log 2>&1MAILTO=""— не отправлять письма с выводом задач.MAILTO=ivan@example.com— отправлять на этот адрес, если на сервере настроена почта.SHELL=/bin/bash— выполнять команды в bash вместо sh.PATH=…— в каких папках искать программы. Значение пишите целиком: подстановка вида$PATHили$HOMEв расписании не работает.
Как узнать, что задача сработала
Каждый запуск задачи cron записывает в системный журнал. Последние записи покажет команда:
sudo journalctl -u cron -n 20Запуск задачи выглядит так:
Oct 10 03:30:01 myserver CRON[2345]: (ivan) CMD (/home/ivan/backup.sh)В скобках — владелец расписания и команда. Строка значит, что cron запустил команду; удачно ли она отработала, покажет её собственный вывод — поэтому его сохраняют в файл. Если строки нет или задача не сделала своё дело, смотрите разбор Cron не запускает скрипт: что проверить.
Ошибки и как их исправить
| Ошибка | Что случилось | Разбор |
|---|---|---|
errors in crontab file, can't install. | В строке расписания ошибка | Разбор |
bad minute, bad hour и похожие | Неверное значение в поле времени | Разбор |
| Задача не запускается или не работает | Время, пути, оболочка или права | Разбор |
No MTA installed, discarding output | Вывод задачи некуда отправить | Разбор |
Permission denied при запуске скрипта | У скрипта нет права на выполнение | Разбор |
Команды и тексты сообщений сверены с пакетом cron 3.0pl1-184ubuntu2 из Ubuntu 24.04 — его справкой и исходным кодом.
Источники
- Справка crontab(5) из пакета cron для Ubuntu 24.04 — поля расписания, диапазоны, шаг, записи с @, знак %, переменные.
- Справка cron(8) из пакета cron для Ubuntu 24.04 — проверка расписаний раз в минуту, /etc/cron.d, часовой пояс.
- Справка crontab(1) из пакета cron для Ubuntu 24.04 — ключи -e, -l, -r и -i, файлы cron.allow и cron.deny.
- Исходный код cron: do_command.c — запуск через sh -c из домашней папки, текст No MTA installed.
- Исходный код cron: cron.c — задачи @reboot только при загрузке системы.
- Исходный код cron: misc.c — вид записей cron в журнале.
- Справка journalctl для Ubuntu 24.04 — ключи -u и -n.
Сверено 10 октября 2026 года.
Что почитать дальше
Проверено и обновлено: 10.10.2026