Короткий ответ
Причину смотрят через journalctl -u <service> --since "1 hour ago" и systemctl status <service>; чтобы не попасть в бесконечный restart loop, настраивают Restart=on-failure вместе с StartLimitBurst/StartLimitIntervalSec, которые останавливают попытки после N неудач за интервал.
Как это работает подробнее
systemd запускает процесс как дочерний и следит за его завершением; Restart=on-failure перезапускает только при ненулевом коде выхода, StartLimitIntervalSec/StartLimitBurst переводят unit в failed после слишком частых перезапусков.
Пример кода
Пример конфигурации
[Service]
ExecStart=/usr/bin/gunicorn app:app --bind 0.0.0.0:8000
Restart=on-failure
RestartSec=5
StartLimitIntervalSec=60
StartLimitBurst=5Что использовать на практике
- Рекомендация.
journalctl -u myapp -n 200 --no-pagerпокажет traceback падения; частые перезапуски могут быть вызваны OOM (dmesg | grep -i oom), необработанным исключением при старте или недоступной зависимостью при старте.
Подводные камни
- Риск.
Restart=alwaysбез лимитов — при системной проблеме сервис перезапускается тысячи раз в минуту, маскируя корневую причину; не настраиватьRestartSec— слишком частые немедленные перезапуски не дают внешней зависимости время восстановиться.