riceve una notifica quando il servizio monitorato da systemd entra nello stato non riuscito


32

È necessario che vengano inviati messaggi di rete quando un servizio systemd presenta arresti anomali o si blocca (ovvero, entra in stato di errore; monitoro il blocco tramite WatchdogSec =). Ho notato che il nuovo sistema ha FailureAction =, ma poi ho visto che questo non consente comandi arbitrari, ma solo il riavvio / arresto.

In particolare, ho bisogno di un modo per avere un messaggio di rete inviato quando systemd rileva il crash del programma e un altro quando rileva che si è bloccato.

Spero in una risposta migliore di "analizzare i log" e ho bisogno di qualcosa che abbia un tempo di risposta quasi istantaneo, quindi non credo che un approccio di polling sia buono; dovrebbe essere qualcosa innescato dall'evento che si verifica.


Potete per favore fornire un esempio (anche non funzionante) di ciò che state cercando di ottenere?
Dawud,

Puoi modificare la tua domanda per aggiungere queste informazioni invece di aggiungerle in un commento? :)
dawud,

Risposte:


31

le unità di sistema supportano OnFailure che attiverà un'unità (o più) quando l'unità va in errore. Puoi mettere qualcosa del genere

 OnFailure=notify-failed@%n

E quindi creare il notify-failed@.serviceservizio in cui è possibile utilizzare l' identificatore richiesto (probabilmente si vorrà almeno% i) per avviare lo script o il comando che invierà la notifica.

Puoi vedere un esempio pratico in http://northernlightlabs.se/systemd.status.mail.on.unit.failure


5
Ci sono un paio di correzioni necessarie per le istruzioni sul sito collegato. Innanzitutto, notify%n.serviceè ridondante e si tradurrà in notify@my-service.service.service. In secondo luogo, %idovrebbe essere usato al posto di %I, o tutti i trattini nel nome verranno convertiti in barre.
orodbhen,

4
C'è un modo per farlo per più o tutte le unità, senza modificare i file delle loro unità?
Vladimir Panteleev,

16

Solo il mio modo di avvisare:

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

aggiungi a systemd:

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

Ad altri servizi aggiungere:

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

Ricarica la configurazione:

systemctl daemon-reload

C'è un modo per evitare di innescarlo molte volte di seguito? In alcune situazioni la ricezione di e-mail 1K su un servizio che non ha funzionato durante la notte e ha riprovato più volte a riavviarsi non è utile.
Starbeamrainbowlabs

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.