получить уведомление, когда отслеживаемый системой сервис переходит в состояние сбоя

32

Мне нужно, чтобы сетевые сообщения отправлялись, когда у меня происходит сбой или зависание службы systemd (т. Е. Переход в состояние сбоя; я отслеживаю зависание с помощью WatchdogSec =). Я заметил, что более новые systemd имеют FailureAction =, но потом увидел, что это не разрешает произвольные команды, а только перезагрузку / выключение.

В частности, мне нужен способ отправки одного сетевого сообщения, когда systemd обнаруживает сбой программы, и другого, когда он обнаруживает зависание.

Я надеюсь на лучший ответ, чем «анализ журналов», и мне нужно что-то, что имеет почти мгновенное время отклика, поэтому я не думаю, что подход к опросу хорош; это должно быть что-то вызванное происходящим событием.

Отображаемое имя
источник
Можете ли вы привести пример (даже неработающий) того, чего вы пытаетесь достичь?
Дауд
Можете ли вы отредактировать свой вопрос, чтобы добавить эту информацию вместо того, чтобы добавить ее в комментарии? :)
Дауд

Ответы:

31

Блоки systemd поддерживают функцию OnFailure, которая активирует блок (или более), когда блок выходит из строя. Вы можете положить что-то вроде

 OnFailure=notify-failed@%n

А затем создать notify-failed@.serviceсервис , где вы можете использовать нужный спецификатор (вы , вероятно, хотите , по крайней мере , % I) , чтобы запустить сценарий или команду , которая будет посылать уведомления.

Вы можете увидеть практический пример в http://northernlightlabs.se/systemd.status.mail.on.unit.failure

Пабло Мартинес
источник
5
Есть пара исправлений, необходимых для инструкций на связанном сайте. Во-первых, notify%n.serviceэто избыточно, и приведет к notify@my-service.service.service. Во-вторых, %iследует использовать вместо %I, иначе все тире в имени будут преобразованы в прямые.
orodbhen
4
Есть ли способ сделать это для нескольких или всех юнитов, не изменяя их файлы юнитов?
Владимир Пантелеев
16

Просто мой способ уведомить:

/etc/systemd/system/notify-email@.service

[Unit]
Description=Sent email 

[Service]
Type=oneshot
ExecStart=/usr/bin/bash -c '/usr/bin/systemctl status %i | /usr/bin/mailx -Ssendwait -s "[SYSTEMD_%i] Fail" your_admin@company.blablabla'

добавить в systemd:

systemctl enable /etc/systemd/system/notify-email@service

У других сервисов добавьте:

[Unit]
OnFailure=notify-email@%i.service

Перезагрузите конфигурацию:

systemctl daemon-reload
ceinmart
источник
Есть ли способ избежать его запуска много раз подряд? В некоторых ситуациях получение электронных писем 1K о службе, которая не работала ночью и снова и снова пыталась перезапустить себя, бесполезно.
starbeamrainbowlabs