Короткий ответ
systemd timers интегрированы с journald (единые структурированные логи), поддерживают точный контроль пересечения запусков, автоматические повторные попытки, зависимость от других юнитов и системных событий (например, запуск после пробуждения из спячки), тогда как классический cron проще, но ограничен по этим возможностям и логирует через почту или отдельные файлы.
Как это работает подробнее
Таймер systemd — это отдельный .timer юнит, который по расписанию (OnCalendar) или по относительному времени (OnBootSec, OnUnitActiveSec) активирует связанный .service юнит; это позволяет переиспользовать весь функционал systemd для управляемого юнита — лимиты ресурсов, политику перезапуска при сбое, зависимости — чего нет у задачи cron, запускаемой напрямую демоном cron.
Пример кода
example.txt
# /etc/systemd/system/backup.timer
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.targetЧто использовать на практике
- Практика. timers предпочтительны в современных дистрибутивах для задач, которым нужна гарантия выполнения (Persistent=true компенсирует пропущенные запуски при выключенном сервере), ограничение ресурсов через cgroups или зависимость от состояния сети/других сервисов; cron остаётся проще и привычнее для простых периодических задач на системах без глубокой интеграции с systemd.
Подводные камни
- Риск. Частая ошибка — настраивать частые задачи через OnCalendar с перекрывающимися интервалами без учёта, что предыдущий запуск ещё может выполняться, и не задавать в сервисе ограничение параллельности, что приводит к одновременному выполнению нескольких экземпляров одной и той же задачи.