отримувати сповіщення, коли служба, що контролюється системою, переходить у невдалий стан


32

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

Зокрема, мені потрібен спосіб, коли одне мережеве повідомлення буде надіслане, коли systemd виявить, що програма вийшла з ладу, а інше, коли виявить, що воно зависло.

Я сподіваюся на кращу відповідь, ніж "розбір журналів", і мені потрібно щось, що має майже миттєвий час відповіді, тому я не думаю, що підхід до опитування є хорошим; це повинно бути чимось спровокованим подією, що відбулася.


Чи можете ви надати приклад (навіть не працюючий) того, що ви намагаєтесь досягти?
dawud

Чи можете ви відредагувати своє запитання, щоб додати цю інформацію, а не додавати її в коментар? :)
dawud

Відповіді:


31

системні блоки підтримують 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

Чи є спосіб уникнути його запуску багато разів поспіль? У деяких ситуаціях отримання 1К електронних листів про службу, яка не вдалася вночі і знову і знову намагалася перезапустити себе, не корисно.
starbeamrainbowlabs

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.