Серверное оборудование для бизнеса — надёжные решения для любых задач Подробнее →
Статья

Автоматизация с cron и systemd timers: полное руководство

Автоматизация с cron и systemd timers: полное руководство

Повторяющиеся задачи на сервере должны выполняться автоматически — это аксиома. Долгие годы единственным инструментом для этого был cron, и он отлично справлялся. Сегодня у него появился серьёзный конкурент в лице systemd timers. Разберём оба инструмента детально и выясним, когда что использовать.

Синтаксис crontab

Запись в crontab состоит из пяти полей времени и команды:

# мин  час  день  месяц  день_недели  команда
  30    2    *     *      *            /usr/local/bin/backup.sh

Редактирование для текущего пользователя: crontab -e. Для root: sudo crontab -e. Просмотр: crontab -l.

Специальные директивы cron

Вместо пяти полей можно использовать сокращения:

  • @reboot — выполнить один раз при старте системы
  • @daily (или @midnight) — раз в сутки в 00:00
  • @weekly — раз в неделю в воскресенье в 00:00
  • @monthly — первого числа каждого месяца
  • @hourly — каждый час в нулевую минуту
@reboot /usr/local/bin/startup-check.sh
@daily  /usr/local/bin/daily-report.sh

MAILTO и уведомления

По умолчанию cron отправляет вывод команды на почту. Настройте переменную:

MAILTO="admin@example.com"
30 2 * * * /usr/local/bin/backup.sh

Чтобы отключить письма: MAILTO="". Чтобы перенаправить вывод в файл:

30 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

Логирование cron

В большинстве дистрибутивов cron пишет в системный журнал:

grep CRON /var/log/syslog
journalctl -u cron --since "1 hour ago"

На RHEL/CentOS: journalctl -u crond.

Systemd timer: базовая структура

Systemd timer — это пара файлов: .timer и .service. Создайте /etc/systemd/system/mybackup.service:

[Unit]
Description=My Backup Service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
User=backup

И /etc/systemd/system/mybackup.timer:

[Unit]
Description=Run My Backup Daily

[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true

[Install]
WantedBy=timers.target

Активация:

systemctl daemon-reload
systemctl enable --now mybackup.timer

OnCalendar: гибкое расписание

OnCalendar поддерживает мощный синтаксис:

OnCalendar=daily              # каждый день в 00:00
OnCalendar=Mon *-*-* 08:00   # каждый понедельник в 08:00
OnCalendar=*:0/15            # каждые 15 минут
OnCalendar=2026-03-*         # каждый день марта 2026

Проверить расписание: systemd-analyze calendar "Mon *-*-* 08:00".

Persistent=true: защита от пропущенных запусков

Если сервер был выключен в момент, когда должен был запуститься таймер, Persistent=true гарантирует запуск при следующем включении. Это критично для задач резервного копирования — cron такого не умеет.

Сравнение cron vs systemd timers

Критерий cron systemd timer
Логирование Ограниченное journald, полный вывод
Зависимости Нет systemd units
Persistent Нет Да
Сложность Низкая Средняя
Переменные окружения Ограниченно Через EnvironmentFile

Миграция с cron на systemd timers

Для каждой cron-задачи создайте пару .service + .timer. Проверьте все активные таймеры командой:

systemctl list-timers --all

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

2 Ответа

  1. Наконец-то нормальное сравнение этих двух инструментов. Мы перешли на systemd timers полностью около года назад и не жалеем — journald сильно упрощает отладку упавших задач.

  1. А что делать если нужно запускать задачу каждые 5 минут, но только с 9 до 18? В cron это через несколько строк решается, а в systemd timer не совсем понятно как.