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.

Wyświetlana nazwa
źródło
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 [email protected]usł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

Pablo Martinez
źródło
5
Istnieje kilka poprawek w instrukcjach na połączonej stronie. Po pierwsze, notify%n.servicejest zbędny i spowoduje [email protected]. 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/[email protected]

[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" [email protected]'

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
ceinmart
źródło
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