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 upgrade —
unattended-upgradesв Ubuntu запускается черезapt-daily.timerиapt-daily-upgrade.timer, классический пример миграции с cron на systemd.