~$ Заметки на полях консоли

systemd-таймеры вместо cron

Почему я перевёл периодические задачи на таймеры и как это выглядит на практике.

Cron прост и вездесущ, но у него есть неудобства: вывод задачи теряется, если не настроена почта, пропущенные из-за выключения запуски не догоняются, а окружение отличается от интерактивной оболочки. Таймеры systemd решают всё это без дополнительных утилит.

Сервис

Сначала описываем саму задачу как обычный oneshot-сервис:

# /etc/systemd/system/cleanup-tmp.service
[Unit]
Description=Очистка старых файлов во временном каталоге

[Service]
Type=oneshot
ExecStart=/usr/bin/find /srv/tmp -type f -mtime +7 -delete

Таймер

# /etc/systemd/system/cleanup-tmp.timer
[Unit]
Description=Ежедневная очистка временного каталога

[Timer]
OnCalendar=*-*-* 03:30:00
RandomizedDelaySec=15m
Persistent=true

[Install]
WantedBy=timers.target

Persistent=true запустит задачу при старте, если сервер был выключен в назначенное время. RandomizedDelaySec разносит запуск на нескольких машинах, чтобы они не нагружали общее хранилище одновременно.

Запуск и проверка

systemctl daemon-reload
systemctl enable --now cleanup-tmp.timer
systemctl list-timers cleanup-tmp.timer
journalctl -u cleanup-tmp.service -n 20

Весь вывод задачи попадает в журнал, а код возврата виден в systemctl status. Для разовой проверки достаточно systemctl start cleanup-tmp.service.

Проверить, правильно ли понято выражение календаря, помогает systemd-analyze calendar "*-*-* 03:30:00" — команда покажет ближайшее срабатывание.

← Все записи