Короткий ответ
Автоперезапуск настраивается директивами Restart= (например, on-failure или always) и RestartSec= в секции [Service]; защита от бесконечного цикла обеспечивается директивами StartLimitIntervalSec и StartLimitBurst, которые переводят юнит в состояние failed после превышения числа попыток за заданный интервал, вместо бесконечных рестартов.
Как это работает подробнее
systemd отслеживает код завершения и, если он подпадает под условие Restart= (on-failure реагирует на ненулевой код выхода или сигнал, always — на любое завершение), перезапускает сервис через RestartSec; при этом ведётся счётчик попыток запуска за скользящее окно StartLimitIntervalSec, и если число попыток превышает StartLimitBurst, systemd прекращает попытки и помечает юнит как failed, требуя ручного вмешательства.
Пример кода
[Service]
ExecStart=/usr/bin/myapp
Restart=on-failure
RestartSec=5
StartLimitIntervalSec=60
StartLimitBurst=5Что использовать на практике
- Практика. без лимита на рестарты сервис, падающий из-за неисправимой проблемы (битая конфигурация, недоступная зависимость), будет бесконечно перезапускаться, создавая нагрузку на систему и шум в логах/алертах; разумные значения RestartSec (с небольшой задержкой, иногда растущей) предотвращают busy-loop и дают внешним зависимостям время восстановиться.
Подводные камни
- Риск. Частая ошибка — ставить Restart=always с RestartSec=0 на сервис, зависящий от внешнего ресурса: при длительной недоступности зависимости это создаёт restart storm, забивающий CPU и логи бесполезными попытками запуска.