ServerAID
Найти гайд, команду, тег… ⌘ K
Глоссарий  ·  термин

cron — что это и зачем

cron — классический планировщик задач в Linux: запускает команды по расписанию (раз в минуту, ежедневно в 03:00, каждое воскресенье). Конфигурируется через `crontab` или файлы в `/etc/cron.*`. На современной Ubuntu рядом с ним работает systemd-таймер — более новая альтернатива.

cron

cron — классический планировщик задач в Linux: запускает команды по расписанию (раз в минуту, ежедневно в 03:00, каждое воскресенье). Конфигурируется через crontab или файлы в /etc/cron.*. На современной Ubuntu рядом с ним работает systemd-таймер — более новая альтернатива.

Что это в одном абзаце

cron — демон, который раз в минуту просыпается, читает свои таблицы (crontab) и запускает те задачи, у которых наступило время выполнения. Это базовая автоматизация для серверов: бэкапы по ночам, ротация логов, проверка свободного места, плановые обновления.

# Пример crontab-записи: каждое воскресенье в 03:00 — бэкап
0 3 * * 0  /usr/local/bin/backup.sh

cron существует с 1975 года и стандартизирован POSIX, поэтому ваш crontab будет работать везде — от Ubuntu до OpenBSD и macOS.

Синтаксис cron expression

Каждая строка crontab — это пять полей расписания плюс команда:

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

Поддерживается несколько форм значений:

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

Боевые примеры:

Расписание Что делает
* * * * * каждую минуту
*/5 * * * * каждые 5 минут
0 * * * * каждый час в :00
0 3 * * * ежедневно в 03:00
0 3 * * 0 по воскресеньям в 03:00
0 3 1 * * 1-го числа каждого месяца в 03:00
30 1 * * 1-5 пн-пт в 01:30

cron в Vixie/ISC-варианте (тот, что в Ubuntu) поддерживает алиасы: @reboot, @hourly, @daily, @weekly, @monthly, @yearly. Удобно и читается лучше:

@daily   /usr/local/bin/cleanup.sh
@reboot  /usr/local/bin/warm-cache.sh

Если синтаксис вызывает сомнения — проверяйте через crontab.guru перед сохранением.

Где живут расписания

В Ubuntu cron смотрит на несколько источников:

  • crontab -e — личное расписание текущего пользователя. Файл лежит в /var/spool/cron/crontabs/<user>. Запускается от имени этого пользователя.
  • sudo crontab -e -u www-data — расписание другого пользователя.
  • /etc/crontab — системный crontab. У каждой записи есть дополнительное поле — пользователь, от имени которого выполнять.
  • /etc/cron.d/<package> — конфиги cron, поставляемые пакетами (логротейт, certbot, anacron). Тоже с полем пользователя.
  • /etc/cron.hourly/, cron.daily/, cron.weekly/, cron.monthly/ — просто папки со скриптами. Если положили туда исполняемый файл — он запустится с указанной периодичностью. Запускает их run-parts от имени root.

Команды управления:

crontab -e           # отредактировать своё расписание
crontab -l           # показать своё расписание
crontab -r           # удалить своё расписание (осторожно!)
sudo systemctl status cron       # запущен ли демон
sudo journalctl -u cron --since '1 hour ago'   # логи cron

cron vs systemd-таймер

С приходом systemd появилась альтернатива cron — таймеры. Это unit-файлы *.timer, парные к *.service. Запуск:

sudo systemctl list-timers --all
sudo systemctl status apt-daily-upgrade.timer

Когда systemd-таймер лучше cron:

  • Богаче логи — каждый запуск идёт в journald, фильтруется через journalctl -u <service>. cron пишет лог в почту root или в /var/log/syslog.
  • Persistent=true — если машина была выключена, когда наступило время, таймер сработает после загрузки. cron такие задания пропускает (для этого ставят отдельный anacron).
  • Ресурсные ограниченияMemoryLimit, CPUQuota прямо в unit-файле.
  • Зависимости и условияAfter=network-online.target, ConditionACPower=true. cron не умеет ничего такого.

Когда cron всё ещё уместен:

  • Совместимость — скрипты, которые должны работать одинаково на всех Linux/UNIX.
  • Простота — одна строчка в crontab, не нужно писать два unit-файла.
  • /etc/cron.daily/-стиль — пакеты Ubuntu массово используют это для своих периодических задач (certbot, apt-listchanges).

Большинство современных дистрибутивных пакетов уже мигрировали с cron на systemd-таймеры (apt-daily.timer, fstrim.timer, logrotate.timer). Для своих новых скриптов на Ubuntu имеет смысл писать сразу таймер. Для разовой задачи «раз в день вычистить /tmp» — cron быстрее.

Грабли cron

  • PATH — у cron минимальный PATH, обычно /usr/bin:/bin. Команды типа aws или pg_dump могут не найтись. Решение: писать абсолютный путь (/usr/bin/pg_dump) или явно задавать PATH в начале crontab.
  • Окружение — нет ваших ~/.bashrc-переменных, LANG, LC_ALL могут отличаться. Шелл — обычно /bin/sh (на Ubuntu это dash), не bash. Если нужен bash — пишите bash -c '...' или указывайте SHELL=/bin/bash в crontab.
  • Логи — по умолчанию вывод задачи отправляется почтой пользователю. На сервере без MTA это «теряется». Перенаправляйте: 0 3 * * * /script.sh >> /var/log/script.log 2>&1.
  • Длинные задачи — cron не следит, идёт ли предыдущий запуск. Если задача дольше интервала, накопится несколько параллельных. Лечится flock: 0 * * * * /usr/bin/flock -n /tmp/myjob.lock /script.sh.

Частые вопросы

Что такое cron в Linux

Демон, который запускает команды по расписанию. Раз в минуту читает таблицы расписаний (crontab) и стартует те задачи, у которых пришло время. Стандартный планировщик задач в Linux с 1975 года; работает на любых UNIX-подобных системах.

Чем cron отличается от crontab

cron — это сам демон (фоновой процесс), который работает в системе. crontab — утилита для редактирования таблицы расписаний (crontab -e) и сами файлы расписаний в /var/spool/cron/. Демон один на всю систему, расписаний может быть много (по одному на пользователя плюс системные).

Как добавить задачу в cron на Ubuntu

crontab -e — откроется редактор; добавьте строку формата минута час день месяц день_недели команда. Сохраните — cron подхватит изменения автоматически в течение минуты. Пример: 0 3 * * 0 /usr/local/bin/backup.sh запустит backup.sh каждое воскресенье в 03:00.

Что лучше cron или systemd-таймер

Для новых задач на Ubuntu обычно лучше systemd-таймер: богаче логи, есть Persistent=true (наверстать пропущенный запуск после перезагрузки), ресурсные ограничения, условия запуска. Для одноразовых простых задач или для совместимости с другими UNIX-системами cron остаётся проще и быстрее.

Где смотреть логи cron на Ubuntu

sudo journalctl -u cron --since '1 hour ago' — логи самого демона: какие задачи он запускал. Вывод самих задач (stdout/stderr) cron по умолчанию шлёт почтой; лучше явно перенаправлять в файл: >> /var/log/myjob.log 2>&1. Альтернатива — переписать на systemd-таймер, у которого вывод задачи идёт в journald.

Почему cron-задача работает в шелле, но не из crontab

Чаще всего — разница в окружении. У cron минимальный PATH=/usr/bin:/bin, отсутствуют переменные из .bashrc, шелл — /bin/sh (dash), не bash. Решения: писать абсолютные пути к бинарям, явно задавать PATH=... и SHELL=/bin/bash в начале crontab, или оборачивать команду в bash -c '...'.

Что почитать

  • systemd — современная альтернатива cron на Ubuntu: systemd-таймеры дают больше контроля, лучше логи и условия запуска.
  • systemctl enable: пишем свой systemd unit — как сделать собственный таймер: пара *.timer + *.service вместо строчки в crontab.
  • apt update и apt upgradeunattended-upgrades в Ubuntu запускается через apt-daily.timer и apt-daily-upgrade.timer, классический пример миграции с cron на systemd.

Похожие материалы

grep — что это и зачем
Глоссарий

grep — что это и зачем

grep — стандартная команда Linux для поиска строк по шаблону внутри текстовых файлов и потоков. Берёт текст на вход, отдаёт строки, в которых нашлось совпадение. Базовый инструмент работы с логами, конфигами, выводом других команд через пайп.

Редакция
find — что это и зачем
Глоссарий

find — что это и зачем

find — стандартная команда Linux для поиска файлов и каталогов по имени, типу, правам, размеру, дате и десяткам других критериев. С помощью `-exec` поверх найденного можно сразу выполнять команды. Универсальный инструмент админа для массовой работы с файловой системой.

Редакция
snap — что это и зачем
Глоссарий

snap — что это и зачем

snap — система упаковки и установки приложений от Canonical, разработанная как альтернатива apt. Каждый snap — самодостаточный пакет со своими зависимостями, изолированный от системы через AppArmor. Используется на Ubuntu для Firefox, Chromium, microk8s и многих desktop-приложений.

Редакция
LVM — что это и зачем
Глоссарий

LVM — что это и зачем

LVM — слой абстракции между физическими дисками и файловыми системами в Linux. Объединяет диски в пулы (Volume Groups), нарезает их на логические тома (Logical Volumes) и позволяет изменять размер на лету. Альтернатива классическому partitioning, которая делает работу с дисками гибкой.

Редакция