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


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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.