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.