Автоматизация с cron и systemd timers: полное руководство
- Автоматизация с cron и systemd timers: полное руководство
- Синтаксис crontab
- Специальные директивы cron
- MAILTO и уведомления
- Логирование cron
- Systemd timer: базовая структура
- OnCalendar: гибкое расписание
- Persistent=true: защита от пропущенных запусков
- Сравнение cron vs systemd timers
- Миграция с 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 задачи, требующие надёжности, зависимостей и детального логирования.
Наконец-то нормальное сравнение этих двух инструментов. Мы перешли на systemd timers полностью около года назад и не жалеем — journald сильно упрощает отладку упавших задач.