systemd-таймеры вместо cron
cron по-прежнему работает, но на сервере с systemd у таймеров есть несколько практичных
преимуществ: журнал каждого запуска в journalctl, понятный статус «когда запускалось и
когда запустится», ограничения ресурсов и защита от параллельного запуска той же задачи.
Пара unit + timer
Задача описывается обычным сервисом с Type=oneshot, а расписание — отдельным
таймером с тем же именем.
# /etc/systemd/system/backup.service
[Unit]
Description=Ночной бэкап
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
# /etc/systemd/system/backup.timer
[Unit]
Description=Запуск бэкапа каждую ночь
[Timer]
OnCalendar=*-*-* 03:30
RandomizedDelaySec=10m
Persistent=true
[Install]
WantedBy=timers.target
Persistent=true запускает пропущенную задачу после включения сервера, если в момент
срабатывания он был выключен. RandomizedDelaySec размывает время запуска — полезно,
когда одинаковые таймеры стоят на многих машинах.
Включение и проверка
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers backup.timer
journalctl -u backup.service -n 50
Проверить, как systemd понимает выражение расписания, можно до включения таймера:
systemd-analyze calendar "*-*-* 03:30"
Когда cron всё же удобнее
Для пользовательских задач на машинах без systemd и там, где расписание правят люди, привыкшие
к crontab -e. В остальных случаях таймеры дают больше контроля при той же простоте.