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


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.