BASH
#bash#linux#systemd#service#restart#devops

Systemd: автоперезапуск сервиса при падении

Настройка Restart=, RestartSec= и StartLimitInterval для автоматического перезапуска unit при сбое. Защита от бесконечных перезапусков.

Как использовать

  1. Добавь Restart=on-failure (или on-abnormal) и RestartSec= в секцию [Service] своего unit.
  2. При необходимости ограничь частоту перезапусков: StartLimitIntervalSec= и StartLimitBurst= в [Unit].
  3. Проверка: 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.