Systemd: автоперезапуск сервиса при падении
Настройка Restart=, RestartSec= и StartLimitInterval для автоматического перезапуска unit при сбое. Защита от бесконечных перезапусков.
Как использовать
- Добавь Restart=on-failure (или on-abnormal) и RestartSec= в секцию [Service] своего unit.
- При необходимости ограничь частоту перезапусков: StartLimitIntervalSec= и StartLimitBurst= в [Unit].
- Проверка: systemctl show имя.service -p Restart,RestartUSec; симуляция падения — убить процесс и смотреть systemctl status.
Сервис под systemd может падать из-за ошибок, нехватки памяти или внешних зависимостей. Без настройки перезапуска процесс не поднимется до следующей перезагрузки. Проблема: как включить автоперезапуск при сбое и не уйти в бесконечный цикл перезапусков. Ниже — параметры Restart, RestartSec и лимиты.
Решение
В секции [Service] добавьте:
[Unit]
Description=My application with auto-restart
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/bin/myapp
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
- Restart=on-failure — перезапускать при ненормальном завершении (код выхода ≠ 0, signal, timeout). Варианты:
no(по умолчанию),on-success,on-failure,on-abnormal,on-watchdog,always. - RestartSec=5 — пауза перед перезапуском (секунды). Снижает нагрузку при постоянных падениях.
После правок: sudo systemctl daemon-reload && sudo systemctl restart имя.service.
Ограничение частоты перезапусков
Чтобы избежать бесконечного цикла (например, при постоянной ошибке конфига), в [Unit] добавьте:
[Unit]
Description=My application with restart limits
StartLimitIntervalSec=300
StartLimitBurst=5
[Service]
Type=simple
ExecStart=/usr/bin/myapp
Restart=on-failure
RestartSec=10
- StartLimitIntervalSec=300 — окно времени (5 минут).
- StartLimitBurst=5 — максимум 5 попыток запуска в этом окне. После превышения unit переходит в failed, перезапуск прекращается.
Проверка лимита: systemctl show имя.service -p StartLimitIntervalUSec,StartLimitBurst.
Проверка настроек
systemctl show myapp.service -p Restart -p RestartUSec -p StartLimitIntervalUSec -p StartLimitBurst
journalctl -u myapp.service -f
Связанные сниппеты: Systemd: создание unit-файла сервиса, Systemd timer: замена cron.