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" — команда покажет ближайшее срабатывание.