SuccessExitStatus= и RestartPreventExitStatus=
SuccessExitStatus= перечисляет коды и сигналы, которые systemd должен считать успешным завершением. RestartPreventExitStatus= перечисляет коды, при которых перезапуск не выполняется.
Что делает
Первый параметр нужен программам со своими соглашениями: например код 2 может означать «нечего делать», а не ошибку. Без него такая служба всегда будет помечена упавшей.
Второй параметр важнее, чем кажется: он позволяет остановить бесполезный цикл перезапусков. Если программа вернула код «неверная конфигурация», перезапуск ничего не исправит — и лучше остаться в состоянии failed, чем крутиться до предела частоты запусков.
Где ставится. В секции [Service]. Перечисляются числа и имена сигналов через пробел.
Значения
| Значение | Что происходит |
|---|---|
SuccessExitStatus=2 8 SIGKILL | эти коды и сигнал считаются успехом. |
RestartPreventExitStatus=78 | при этом коде перезапуска не будет. |
RestartForceExitStatus=75 | при этом коде перезапуск будет даже при Restart=on-success. |
Пример
Служба, которая сообщает кодом «нечего делать», и запрет перезапуска при ошибке настроек.
[Service]
SuccessExitStatus=2
RestartPreventExitStatus=78
Restart=on-failure
RestartSec=10s
Код 78 из набора sysexits означает ошибку настройки. Перезапускать службу с неверной настройкой бессмысленно: она будет падать так же.
Типичные ошибки
Без объявления успешных кодов служба с нестандартным соглашением всегда выглядит упавшей.
Слишком широкий список успешных кодов маскирует настоящие сбои.
Имена сигналов пишутся с префиксом SIG, числа — без него; смешивать в одной строке можно.
Связанные ошибки
- status=7/NOTRUNNING в systemdКод 7/NOTRUNNING по соглашению LSB: программа не запущена. Обычно приходит от ExecStop или ExecReload, а не от запуска.
- Failed with result 'exit-code'Состояние exit-code: служба завершилась с ненулевым кодом. Что это сообщение значит и где искать настоящую причину.
- start-limit-hit: служба заблокирована после серии перезапусковСостояние start-limit-hit и сообщение start request repeated too quickly: systemd перестал перезапускать службу. Как разблокировать и найти исходную причину.
Рядом стоящие параметры
Источники
- systemd.service(5)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)