OnFailure= в systemd: что запустить при сбое службы
Перечисляет unit, которые systemd запустит, когда этот перейдёт в состояние failed. Обычно так вызывают службу оповещения.
Что делает
Это единственный встроенный способ узнать о сбое, не опрашивая систему постоянно. В паре с шаблонным unit получается универсальное оповещение: OnFailure=notify@%n.service, где подстановка %n передаёт имя упавшей службы.
Оповещение особенно нужно задачам по таймеру: их сбой иначе остаётся незамеченным, потому что таймер продолжает срабатывать по расписанию.
Где ставится. В секции [Unit].
Значения
| Значение | Что происходит |
|---|---|
notify-failure@%n.service | шаблонная служба оповещения с именем упавшего unit. |
OnFailureJobMode=replace | режим постановки задания; по умолчанию replace. |
Пример
Оповещение о сбое любой службы одним шаблоном.
# в любой службе
[Unit]
OnFailure=notify-failure@%n.service
# /etc/systemd/system/notify-failure@.service
[Unit]
Description=Оповещение о сбое %i
[Service]
Type=oneshot
ExecStart=/usr/local/bin/notify-failure %i
Подстановка %n даёт полное имя unit с расширением, %N — без него. В шаблоне оно доступно как %i.
Типичные ошибки
Оповещение не срабатывает при остановке вручную: только при переходе в состояние failed.
Служба оповещения сама может упасть — и об этом уже никто не узнает. Она должна быть предельно простой.
При цикле перезапусков оповещения посыплются пачкой: стоит предусмотреть подавление повторов.
Связанные ошибки
- Таймер срабатывает, но задача падает незаметноТаймер работает исправно, а задача каждый раз завершается ошибкой, и об этом никто не узнаёт. Как настроить оповещение через OnFailure.
- start-limit-hit: служба заблокирована после серии перезапусковСостояние start-limit-hit и сообщение start request repeated too quickly: systemd перестал перезапускать службу. Как разблокировать и найти исходную причину.
- Failed with result 'exit-code'Состояние exit-code: служба завершилась с ненулевым кодом. Что это сообщение значит и где искать настоящую причину.
Рядом стоящие параметры
Источники
- systemd.unit(5)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)