Справочник

Cron в Linux: как устроено расписание задач

Cron — служба Linux, которая сама запускает команды и скрипты по расписанию: каждую ночь, каждый час или раз в месяц. Разберём, как читать и писать строки расписания и где они хранятся на сервере.

Обновлено 10.10.2026≈ 8 мин чтения
Содержание 12

Что такое 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:000 0 *
@weeklyПо воскресеньям в 0:000 0 0
@monthly1-го числа в 0:000 0 1
@yearly или @annually1 января в 0:000 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>&1
  • MAILTO="" — не отправлять письма с выводом задач. 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 — его справкой и исходным кодом.

Источники

Сверено 10 октября 2026 года.

Что почитать дальше

Проверено и обновлено: 10.10.2026