Cron против systemd.timer: как я автоматизирую задачи на VPS

ГлавнаяCron против systemd.timer: как я автоматизирую задачи на VPS

Содержание

Если у тебя есть VPS и ты всё ещё запускаешь бэкап вручную или не чистишь временные файлы, пока диск не заполнится — добро пожаловать в автоматизацию.

Когда-то я тоже начинала с классического

cron
, как и все. Но потом поняла, что
systemd.timer
— это совсем другой уровень. Расскажу, чем они отличаются, где что удобнее и почему я теперь чаще пишу
.timer
, чем редактирую
crontab
.


🧾 Что такое cron и зачем он нужен

cron
— это старый добрый планировщик задач в Linux. Работает по расписанию, читает
crontab
, выполняет команды. Простой, понятный, в каждой системе.

Пример: запуск скрипта каждые 5 минут:

*/5 * * * * /home/user/cleanup.sh

Плюсы:

  • работает везде;
  • мгновенно понятно, что и когда запускается;
  • можно отредактировать через
    crontab -e
    и забыть.

Минусы:

  • нет логов по умолчанию (если не перенаправишь в файл — ты ничего не узнаешь);
  • нет зависимостей — не знаешь, был ли интернет, была ли другая служба поднята;
  • сложно отлаживать, если что-то пошло не так.

🚀 Что такое systemd.timer и как с ним жить

Если у тебя современная Ubuntu или Debian,

systemd
уже установлен и работает. И вместе с ним — таймеры.

По сути,

systemd.timer
— это аналог cron, но с возможностями, которых у cron просто нет.

Хочешь пример?

# /etc/systemd/system/backup.service [Unit] Description=Nightly backup [Service] Type=oneshot ExecStart=/home/user/backup.sh
# /etc/systemd/system/backup.timer [Unit] Description=Run backup daily [Timer] OnCalendar=*-*-* 03:00:00 Persistent=true [Install] WantedBy=timers.target

Запуск:

systemctl daemon-reexec systemctl daemon-reload systemctl enable --now backup.timer

Теперь скрипт будет выполняться каждый день в 3 ночи.


🧩 В чём плюсы systemd.timer

  • Живые логи: можно посмотреть
    journalctl -u backup.service
    и узнать, что реально происходило.
  • Гибкое расписание:
    OnCalendar=Mon *-*-* 07:00
    — запускай каждый понедельник.
  • Можно запустить вручную (через
    systemctl start your.service
    ).
  • Автоматический перезапуск, если система была выключена во время плановой задачи (если
    Persistent=true
    ).

🕵️ Где смотреть активные таймеры?

Всё просто:

systemctl list-timers

или

systemctl list-timers --all

Увидишь список: какой

.timer
, когда последний и следующий запуск, активен ли.


🆚 Cron vs systemd — когда что использовать

Что нужно сделатьЧто выбрать
Быстро раз в 5 минут вызвать скриптcron (простой случай)
Хочешь логов и контроляsystemd.timer
Зависит от других служб (nginx, mysql)systemd.timer
Нужно поведение «после перезагрузки»systemd.timer с Persistent
Запуск от конкретного пользователяsystemd user timer

🔍 Как создать user timer (без sudo)

systemctl --user enable --now myscript.timer

Но не забудь —

systemd
должен быть запущен с поддержкой user instance. Иногда нужно добавить в
.bashrc
:

export XDG_RUNTIME_DIR=/run/user/$(id -u)

🐛 Где я спотыкалась

  • не добавила
    Persistent=true
    — таймер не сработал после перезагрузки;
  • забыла
    ExecStart=
    в
    .service
    — таймер работал, а команда — нет;
  • названия
    .service
    и
    .timer
    не совпадали — и таймер запускал «ничего».

📝 Итого

Cron хорош, если тебе надо что-то простое и быстрое.
Но как только ты хочешь стабильности, логов и предсказуемости —

systemd.timer
выигрывает.

Сейчас у меня на каждом VPS минимум 3 таймера: бэкап, очистка, обновления. Все на

systemd
.
Cron — остался только для привычных вещей вроде
letsencrypt
.