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

Знание cron полезно как обычному пользователю, так и администратору. В этой статье вы найдёте простые объяснения, примеры, готовые шаблоны, чек-листы для ролей, сценарии устранения неисправностей и рекомендации по безопасности. Начнём с базового — потом углубимся.
Основные понятия
- Cron — демон (служба), который периодически проверяет расписания задач и запускает команды в указанное время.
- Crontab — файл с расписанием задач для конкретного пользователя или для системы.
- Cron job (задача cron) — одна строка в crontab, описывающая время и команду.
Короткое определение: crontab — это «календарь задач» для вашего пользователя в Linux.
Почему cron всё ещё важен
Cron прост, надёжен и присутствует практически во всех дистрибутивах Linux. Он хорошо подходит для периодических задач: бэкапов, очистки логов, загрузки данных, отправки отчётов. Для машин, которые работают 24/7, cron остаётся незаменимым инструментом. Однако у cron есть ограничения (нет учёта пропущенных запусков при выключенном ПК), и о них тоже поговорим.
Что такое cron?
Cron — системный сервис, работающий в фоновом режиме. Он читает crontab-файлы и запускает команды в запланированное время. Разные дистрибутивы могут использовать разные реализации (cronie, vixie-cron, fcron и т. п.), но синтаксис crontab у большинства схож.
Эта статья ориентирована на vixie-cron (широко распространён в Ubuntu и её производных), но объяснения применимы ко многим другим версиям.
Что такое crontab?
Crontab — это файл, где указываются задачи. У каждого пользователя свой crontab, включая root. Пользовательские crontабы хранятся в каталоге:
/var/spool/cron/crontabs/Просмотреть crontab текущего пользователя можно командой:
crontab -lЧтобы посмотреть crontab root:
sudo crontab -lСуществует и системный crontab:
/etc/crontabА также каталоги для периодических задач:
/etc/cron.hourly/
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.monthly/
/etc/cron.d/Как правило, эти системные задания создаются пакетами и редактируются редко.
Как запланировать задачу (базовый сценарий)
Правильный способ редактирования crontab — использовать его интерфейс:
crontab -eРедактирование crontab другого пользователя:
sudo crontab -u username -eCrontab состоит из двух частей:
- Переменные окружения (PATH, SHELL, HOME и т. п.).
- Список задач, по одной задаче на строку.
Образец строки задачи (формат):
# ┌───────────── минута (0 - 59)
# │ ┌──────────── час (0 - 23)
# │ │ ┌────────── день месяца (1 - 31)
# │ │ │ ┌──────── месяц (1 - 12)
# │ │ │ │ ┌────── день недели (0 - 7) (0 или 7 = воскресенье)
# │ │ │ │ │
# * * * * * команда_to_выполнитьПростой пример запуска скрипта в 3:30 каждое утро:
30 3 * * * /usr/local/bin/backup.shИли ежечасный лог-файл:
0 * * * * /usr/local/bin/rotate-logs.sh >> /var/log/myapp/rotate.log 2>&1Специальные выражения
Вместо пяти полей можно использовать короткие ключи:
- @reboot — при загрузке системы
- @hourly — ежечасно (т.е. 0 )
- @daily — ежедневно (т.е. 0 0 *)
- @weekly — еженедельно (т.е. 0 0 0)
- @monthly — ежемесячно (т.е. 0 0 1 )
- @yearly — ежегодно
Пример:
@reboot /usr/local/bin/start-agent.shШаблоны и шаги
- Звёздочка () означает «каждое значение». Например, в поле минут `` — каждую минуту.
- Диапазон
14-22в поле часов — каждый час с 14 до 22 (включительно). - Список
1,3,5в поле дня недели — понедельник, среда, пятница (если считать 1 — понедельник в вашей системе). - Шаг
*/15в поле минут — каждые 15 минут. - Комбинации возможны:
3-20/3— каждые 3 часа в диапазоне с 3 до 20.
Важно: нельзя смешивать текстовые и числовые диапазоны в одном выражении (например, jan-mar допустимо в поле месяц, но Tue,Fri-Sun — недопустимо, если смешивать форматы неправильно).
Полезные примеры crontab
Примеры, которые вы можете вставить прямо в crontab -e.
- Резервное копирование каждое утро в 02:00:
0 2 * * * /usr/local/bin/full-backup.sh >> /var/log/backup.log 2>&1- Перезапуск сервиса каждый день в 04:05 (как пример):
5 4 * * * /bin/systemctl restart myservice- Смена обоев каждые 3 дня в 19:00 (пример для настольного пользователя):
0 19 */3 * * DISPLAY=:0 /usr/local/bin/change-wallpaper.sh- Проверка подкастов по понедельникам в 10:20 и 20:20:
20 10 * * 1 /usr/local/bin/check-podcasts.sh
20 20 * * 1 /usr/local/bin/check-podcasts.sh- Напоминание о дне рождения 25 марта каждые 30 минут в интервале 09:00-17:00:
*/30 9-17 25 3 * /usr/local/bin/birthday-reminder.sh- Проверка почты каждые 15 минут с 8 до 20 по будням:
*/15 8-20 * * 1-5 /usr/local/bin/check-mail.sh >> /home/username/mail-check.log 2>&1Советы по созданию надёжных задач
- Всегда указывайте полные пути к исполняемым файлам (например,
/usr/bin/python3), либо явно задайте PATH в начале crontab. - Перенаправляйте stdout и stderr в лог:
>> /var/log/task.log 2>&1. - Добавляйте полезные временные метки в логи внутри скриптов:
echo "$(date +'%F %T') — started" >> /var/log/task.log. - Тестируйте команды вручную от имени пользователя, у которого будет crontab.
- Не полагайтесь на окружение: crontab запускается в минимальном окружении.
- Давайте задачам имена/комментарии в отдельной строке, чтобы в будущем легче было читать crontab (комментарии начинаются с
#). - Оставляйте пустую строку в конце файла — некоторые реализации cron требуют этого.
- Экранируйте символ
%в командах (замените на\%), так как cron интерпретирует%как перевод строки.
Как проверять, что задачи выполняются
- Логи cron:
- На большинстве систем сообщения cron попадают в системный лог
/var/log/syslogили/var/log/cron. Проверка общая команда:
cat /var/log/syslog | grep -i cron- На некоторых дистрибутивах есть отдельный файл
/var/log/cron.
Логи задач: если вы перенаправили вывод в файл (
>> /path/to/log 2>&1), смотрите этот файл.Email-уведомления: cron может отправлять стандартный вывод и ошибки по почте на локального пользователя. Для этого нужна настроенная MTA (postfix/ssmtp/exim). Многие домашние системы этого не имеют.
Проверка статуса службы cron (systemd):
systemctl status cron(Для систем с Upstart или SysV команды отличаются — service cron status или initctl list.)
Что делать, если cron не работает
Пошаговый план диагностики:
- Служба запущена?
systemctl status cron
# или
service cron statusЕсли служба не запущена — стартуйте и посмотрите логи:
sudo systemctl start cron
sudo journalctl -u cron --since "1 hour ago"- Есть ли права на crontab?
Проверьте файлы /etc/cron.allow и /etc/cron.deny.
- Если существует
cron.allow, в нём должен быть ваш пользователь. - Если существует
cron.deny, в нём не должно быть вашего пользователя.
- PATH и окружение
Crontab использует минимальный PATH. Либо укажите PATH в начале crontab, либо используйте абсолютные пути:
PATH=/opt/myapp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binИли в скрипте:
#!/bin/bash
export PATH=/opt/myapp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# дальше задачи- Формат crontab
- Одна задача — одна строка.
- Комментарии начинаются с
#и должны быть отдельной строкой. - Экранируйте
%. - Обязательно пустая строка в конце файла.
Проверьте вывод cron в системных логах после попытки запуска.
Если задача зависит от GUI (DISPLAY), убедитесь, что у неё установлен нужный DISPLAY и XAUTHORITY, или запустите задачу через systemd пользовательский таймер/сервис.
Встроенные инструменты: GUI и веб-интерфейсы
Не обязательно редактировать crontab в терминале:
- KDE: KCron (Системные настройки → Планировщик задач).
- GNOME: GNOME Schedule (если доступен).
- Веб-интерфейсы: Crontab-UI, Minicron — полезны при управлении задачами на многих машинах.
Альтернативы и дополнения к cron
- at — для одноразовых заданий.
- anacron — дополняет cron: выполняет задания, пропущенные из‑за выключения компьютера (каждое задание — не чаще одного раза в день).
- systemd timers — современная замена/альтернатива: интеграция с systemd, учёт пропущенных запусков и более гибкая конфигурация (хороши для сервисов и серверов с systemd).
- fcron, Hcron, SuperCron — расширенные реализации с дополнительными функциями.
- GNUbatch — ориентирован на зависимости между заданиями.
Краткая рекомендация:
- Серверы 24/7: cron (или systemd timers) подходят отлично.
- Ноутбуки/desktops, которые часто выключают: используйте anacron или systemd timers с опцией Persistent=true.
Сравнение: cron vs anacron vs systemd timers
- cron: запускает по расписанию, не компенсирует пропуски (подходит для серверов).
- anacron: выполняет пропущенные задания при следующем запуске системы; не гарантирует точное время (минимальная единица — день).
- systemd timers: гибкость, опции Persistent и AccuracySec, интеграция с systemd-journal.
Короткая таблица (качественно):
- Надёжность при выключении: cron — низкая, anacron — высокая, systemd timers — высокая (с настройкой).
- Простота: cron — прост, anacron — прост, systemd timers — сложнее в конфигурации.
- Зависимости: cron — нет, anacron — нет, systemd timers — можно через unit-файлы.
Шаблоны и чек-листы (Role-based)
Ниже — наборы задач и контрольных пунктов для разных ролей.
Для администратора системы
Чек-лист при создании периодической задачи:
- Определить цель и ожидаемый результат.
- Выбрать пользователя, от которого должна выполняться задача.
- Указать абсолютные пути ко всем исполняемым файлам.
- Задать PATH или прописать в скрипте.
- Перенаправить stdout/stderr в лог.
- Установить управление ротацией логов (logrotate).
- Добавить мониторинг выполнения (оповещение при ошибках).
- Проверить безопасность (права на скрипты).
Для разработчика
- [ ] Локально выполнить команду в окружении похожем на crontab (например,
env -i /bin/bash -l -c 'команда'). - Написать idempotent-скрипты (бесследное повторное выполнение).
- Сделать тестовую задачу с маленьким интервалом, чтобы убедиться в результате.
- Убедиться, что задачи не конкурируют за ресурсы (lock-файл или flock).
Для настольного пользователя
- Оценить, нужна ли задача при выключенном компьютере (если нет — использовать anacron или systemd timer с Persistent).
- Проверить DISPLAY/XAUTHORITY для GUI-скриптов.
- Раз в месяц просматривать crontab на предмет устаревших задач.
Руководство по безопасности и надёжности
- Не храните пароли в crontab.
- Скрипты должны проверять входные данные и окружение.
- Используйте абсолютные пути и минимально допустимые привилегии (не запускайте лишнее от root).
- Ограничьте доступ к crontab и к исполняемым файлам с помощью прав доступа (chmod 700 для приватных скриптов).
- Для предотвращения одновременного запуска нескольких экземпляров используйте
flock:
# Пример использования flock
* * * * * /usr/bin/flock -n /var/lock/mytask.lock /usr/local/bin/mytask.sh >> /var/log/mytask.log 2>&1- Логи храните в контролируемых местах и настраивайте ротацию (например, logrotate).
Типичные ошибки и их исправление
- Ничего не выполняется: проверьте, запущен ли cron, и нет ли ошибок в crontab.
- Команда выполняется, но ничего не делает: проблема в PATH; указывайте абсолютные пути.
- Задача выполняется под неверным пользователем: убедитесь, что редактировали нужный crontab (
crontab -evssudo crontab -e). - Скрипт требует GUI: добавьте переменные DISPLAY и XAUTHORITY.
- Не видите логов: перенаправьте stdout/stderr и проверьте права на папку логов.
Playbook: как безопасно ввести новую задачу в продакшен
- Разработать и протестировать скрипт локально.
- Добавить логирование и возврат кода завершения.
- Создать тестовую crontab с коротким интервалом (например, каждые 5 минут).
- Проверить логи и поведение в течение 24–48 часов.
- Перенести задачу в нужный интервал и документировать её в change-log.
- Настроить оповещения на ошибку (например, через систему мониторинга или письма).
Incident runbook: задача не выполняется (быстрый план)
- Проверить статус службы:
systemctl status cron. - Просмотреть последние строки логов cron:
journalctl -u cron --no-pager -n 200илиgrep -i cron /var/log/syslog. - Проверить crontab на синтаксические ошибки:
crontab -l. - Выполнить команду вручную под тем же пользователем.
- Проверить окружение (PATH, SHELL, HOME).
- Если требуется GUI — проверить DISPLAY и права.
- Если всё ещё неясно — временно заменить команду тестовой (
echo "ok" >> /tmp/cron-test.log) и посмотреть, выполнится ли она.
Тест-кейсы и критерии приёмки
Критерии приёмки новой задачи:
- Задача запускается в запланированное время на тестовой машине в 90% запусков в течение 3 дней.
- Задача записывает лог с отметкой времени при старте и завершении.
- При успешном завершении возвращает код 0, при ошибке — ненулевой код и отправляет уведомление.
- Скрипт не оставляет временных файлов без удаления или ротации.
Пример тест-кейса:
- Подготовка: добавить тестовую задачу
*/5 * * * * /usr/local/bin/test-script.sh >> /tmp/test.log 2>&1. - Ожидаемый результат: файл
/tmp/test.logпополняется каждые 5 минут, в логе есть отметки времени и код 0.
Шпаргалка (cheat sheet)
- Просмотр crontab:
crontab -l - Редактирование crontab:
crontab -e - Удалить crontab:
crontab -r - Указать crontab для пользователя:
sudo crontab -u username -e - Проверить сервис:
systemctl status cronилиservice cron status - Проверка логов:
grep -i cron /var/log/syslog
Snippets — полезные куски кода
- Логирование с отметкой времени:
*/10 * * * * /usr/local/bin/task.sh >> /var/log/task.log 2>&1 && echo "$(date +'%F %T') task finished" >> /var/log/task.log- Использование flock для одного экземпляра:
0 3 * * * /usr/bin/flock -n /tmp/mytask.lock /usr/local/bin/mytask.sh- Переадресация почты cron в файл (если нет MTA):
MAILTO=""
* * * * * /usr/local/bin/check.sh >> /home/username/cron-mail.txt 2>&1Ментальные модели и эвристики
- “Cron — это таймер, а не очередь задач”: cron запускает задачи в заданные моменты, но не управляет зависимостями.
- “Окружение crontab максимально минимально”: думайте, что crontab — это чистая система без ваших привычных алиасов и переменных.
- “Логи — ваши лучшие друзья”: без логов вы не сможете диагностировать поведение.
- “Разделение обязанностей”: не смешивайте системные задачи и пользовательские скрипты без явной необходимости.
Когда cron не подходит (контрпримеры)
- Если вам нужна гарантия исполнения задания, даже если система была выключена в запланированное время — используйте anacron или systemd timers с Persistent.
- Для сложных зависимостей между задачами лучше подойдёт GNUbatch или система оркестрации (например, airflow для data pipelines).
- Для задач с миллисекундной точностью cron не годится — он не поддерживает секунды.
Совместимость и миграция
- При переходе между реализациями cron проверьте: поддерживает ли новая реализация
@reboot, экранирование%, формат cron.d и системный crontab/etc/crontab. - Перенос crontab между машинами:
crontab -l > mycrontab.txtна одной машине иcrontab mycrontab.txtна другой. Перед применением проверьте содержимое файла.
Краткий глоссарий (1 строка каждый)
- cron: фонова служба для запуска заданий по расписанию.
- crontab: файл расписания задач для пользователя или системы.
- anacron: утилита, дополняющая cron для выполнения пропущенных заданий.
- systemd timers: таймеры systemd, современная альтернатива cron с доп. возможностями.
Решение-дерево для выбора инструмента (Mermaid)
flowchart TD
A[Нужно запланировать задачу?] --> B{Запускать регулярно или один раз?}
B -->|Один раз| C[Используйте at]
B -->|Регулярно| D{Система всегда онлайн?}
D -->|Да| E[cron или systemd timers]
D -->|Нет| F[anacron или systemd timers с Persistent]
E --> G{Нужна интеграция с unit-файлами?}
G -->|Да| H[systemd timers]
G -->|Нет| I[cron]Практическая методология: «Plan–Test–Deploy–Monitor»
- Plan — описать задачу, цель и критерии успеха.
- Test — протестировать локально и в тестовой среде с коротким интервалом.
- Deploy — выставить в crontab в production, документировать.
- Monitor — настроить логирование и оповещения, проверять выполнение.
Часто задаваемые вопросы (FAQ)
Q: Где cron хранит свои задания?
A: Пользовательские crontab-файлы находятся в /var/spool/cron/crontabs/, системный — /etc/crontab, а для периодических задач есть каталоги /etc/cron.daily/, /etc/cron.hourly/ и т. д.
Q: Как перенаправить вывод задачи в лог?
A: Добавьте >> /path/to/log 2>&1 в конец строки crontab.
Q: Почему мой скрипт работает при ручном запуске, но не работает в cron?
A: Частые причины — PATH/окружение, отсутствие прав, GUI-зависимость, и отсутствие экранирования %.
Q: Как избежать одновременного запуска нескольких копий задачи?
A: Используйте flock или проверку lock-файла внутри скрипта.
Заключение
Cron — простой, но мощный инструмент для автоматизации задач в Linux. Он остаётся актуальным благодаря своей надёжности и распространённости. Однако важно понимать его ограничения и дополнять его средствами вроде anacron или systemd timers там, где это необходимо. Используйте шаблоны, тестируйте задачи, логируйте результаты и применяйте рекомендации по безопасности, чтобы ваши автоматизированные процессы были устойчивыми и прозрачными.
Image Credit: schedule board by Gonzalo Aragon via Shutterstock
Похожие материалы
Как управлять полями в Google Документах
Как полностью выключить PS5 — быстрый гайд
Организация проводов под столом
Объединить изображения в PDF на Windows 10/11
Колесико мыши прокручивает в обратную сторону — что делать