Restart= в systemd: когда служба перезапускается сама
Определяет, в каких случаях systemd перезапускает службу после её завершения. По умолчанию перезапуска нет вовсе: упавшая служба остаётся остановленной.
Что делает
Значение по умолчанию no удивляет многих: единственный сбой оставляет службу лежать до ручного вмешательства или перезагрузки. Для постоянно работающих служб почти всегда нужен on-failure, а always — там, где служба должна работать при любых обстоятельствах, включая штатное завершение.
Перезапуск ограничен пределом частоты: StartLimitBurst= запусков за StartLimitIntervalSec=. Превысив его, служба уходит в состояние start-limit-hit и не запускается даже вручную, пока счётчик не сброшен. Поэтому Restart=always без RestartSec= — плохая пара: падающая служба упирается в предел за секунды.
Где ставится. В секции [Service]. Обратите внимание: RestartSec= задаёт паузу и относится сюда же.
Значения
| Значение | Что происходит |
|---|---|
no | по умолчанию: перезапуска нет. |
on-failure | при ненулевом коде, сигнале, таймауте и срабатывании сторожевого таймера. Обычный выбор для служб. |
always | всегда, включая штатное завершение с нулевым кодом. |
on-success | только при успешном завершении — редкий случай, для служб, работающих циклами. |
on-abnormal | при сигнале, таймауте и сторожевом таймере, но не при ненулевом коде. |
on-abort | только при завершении сигналом, который не был перехвачен. |
on-watchdog | только по срабатыванию сторожевого таймера. |
По умолчанию: no
Пример
Обычная настройка перезапуска для постоянно работающей службы.
[Service]
Restart=on-failure
RestartSec=5s
# окно частоты запусков задаётся в [Unit]
[Unit]
StartLimitIntervalSec=60
StartLimitBurst=5
Пять попыток за минуту с паузой в пять секунд — разумный запас: разовый сбой лечится сам, а бесконечный цикл останавливается.
Типичные ошибки
Restart=always вместе с Type=oneshot даёт цикл: задача отрабатывает и запускается снова. Для регулярных задач нужен таймер.
Без RestartSec= перезапуск идёт мгновенно, и служба упирается в предел частоты запусков за секунды.
Перезапуск маскирует проблему: служба «работает», а причина падений остаётся. Стоит смотреть счётчик NRestarts.
Параметры предела частоты (StartLimitBurst=, StartLimitIntervalSec=) живут в секции [Unit], а не [Service] — их легко поставить не туда.
Связанные ошибки
- start-limit-hit: служба заблокирована после серии перезапусковСостояние start-limit-hit и сообщение start request repeated too quickly: systemd перестал перезапускать службу. Как разблокировать и найти исходную причину.
- Failed with result 'exit-code'Состояние exit-code: служба завершилась с ненулевым кодом. Что это сообщение значит и где искать настоящую причину.
- signal=KILL (status=9/KILL) в systemdПроцесс службы убит сигналом KILL. Кто мог его послать: OOM-killer, таймаут остановки systemd, администратор.
Рядом стоящие параметры
Где важен на практике
Источники
- systemd.service(5)
- systemd.unit(5)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)