otrzymywać powiadomienia, gdy usługa monitorowana przez system przechodzi w stan awarii


32

Muszę wysyłać wiadomości sieciowe, gdy usługa systemowa ulegnie awarii lub zawiesi się (tzn. Przejdzie w stan awarii; monitoruję pod kątem zawieszenia za pomocą WatchdogSec =). Zauważyłem, że nowsze systemy mają FailureAction =, ale potem zobaczyłem, że nie pozwala to na dowolne polecenia, a jedynie na ponowne uruchomienie / wyłączenie.

W szczególności potrzebuję sposobu, aby jeden komunikat sieciowy został wysłany, gdy systemd wykryje, że program się zawiesił, a drugi, gdy wykryje, że zawiesił się.

Mam nadzieję na lepszą odpowiedź niż „parsowanie dzienników” i potrzebuję czegoś, co ma niemal natychmiastowy czas odpowiedzi, więc nie sądzę, aby metoda odpytywania była dobra; powinno to być coś wyzwalanego przez zdarzenie.


Czy możesz podać przykład (nawet niedziałający) tego, co próbujesz osiągnąć?
dawud

Czy możesz edytować swoje pytanie, aby dodać tę informację zamiast dodawać ją w komentarzu? :)
dawud

Odpowiedzi:


31

Jednostki systemowe obsługują Awarię, która aktywuje jednostkę (lub więcej), gdy jednostka ulegnie awarii. Możesz umieścić coś takiego

 OnFailure=notify-failed@%n

A następnie utwórz notify-failed@.serviceusługę, w której możesz użyć wymaganego specyfikatora (prawdopodobnie będziesz potrzebować co najmniej% i), aby uruchomić skrypt lub polecenie, które wyśle ​​powiadomienie.

Praktyczny przykład można zobaczyć w http://northernlightlabs.se/systemd.status.mail.on.unit.failure


5
Istnieje kilka poprawek w instrukcjach na połączonej stronie. Po pierwsze, notify%n.servicejest zbędny i spowoduje notify@my-service.service.service. Po drugie, %inależy użyć zamiast %Ilub wszystkie myślniki w nazwie zostaną przekonwertowane na ukośniki.
orodbhen

4
Czy istnieje sposób, aby to zrobić dla wielu lub wszystkich jednostek bez modyfikowania plików jednostek?
Vladimir Panteleev

16

Właśnie mój sposób na powiadomienie:

/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'

dodaj do systemd:

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

W innych serwisach dodaj:

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

Załaduj ponownie konfigurację:

systemctl daemon-reload

Czy istnieje sposób, aby uniknąć uruchamiania go wiele razy z rzędu? W niektórych sytuacjach odbieranie 1K e-maili o usłudze, która zawiodła w nocy i próbowała ponownie uruchomić się, nie jest pomocna.
starbeamrainbowlabs

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.