Ho un'applicazione critica che viene eseguita come servizio da systemd.
È impostato per il riavvio non appena si verifica un errore.
Come inviare un'e-mail se l'applicazione si riavvia?
Ho un'applicazione critica che viene eseguita come servizio da systemd.
È impostato per il riavvio non appena si verifica un errore.
Come inviare un'e-mail se l'applicazione si riavvia?
Risposte:
Per prima cosa sono necessari due file: un eseguibile per l'invio della posta e un .service per l'avvio dell'eseguibile. Per questo esempio, l'eseguibile è solo uno script di shell che utilizza sendmail
:
/usr/local/bin/systemd-email:
#!/bin/bash
/usr/bin/sendmail -t <<ERRMAIL
To: $1
From: systemd <root@$HOSTNAME>
Subject: $2
Content-Transfer-Encoding: 8bit
Content-Type: text/plain; charset=UTF-8
$(systemctl status --full "$2")
ERRMAIL
Qualunque sia l'eseguibile che usi, probabilmente dovrebbero essere necessari almeno due argomenti come fa questo script di shell: l'indirizzo a cui inviare e il file di unità per ottenere lo stato di. Il .service
che creiamo passerà questi argomenti:
/etc/systemd/system/status-email-user@.service:
[Unit]
Description=status email for %i to user
[Service]
Type=oneshot
ExecStart=/usr/local/bin/systemd-email address %i
User=nobody
Group=systemd-journal
Dove l' utente è l'utente che viene inviato tramite e - mail e l' indirizzo è l'indirizzo e-mail dell'utente. Sebbene il destinatario sia codificato, il file di unità su cui riferire viene passato come parametro di istanza, quindi questo servizio può inviare e-mail per molte altre unità. A questo punto puoi iniziare status-email-user@dbus.service
a verificare che puoi ricevere le e-mail.
Quindi modifica semplicemente il servizio per cui desideri ricevere le e-mail e aggiungilo OnFailure=status-email-user@%n.service
alla [Unit]
sezione. %n
passa il nome dell'unità al modello.
ExecStartPost
sia la scelta giusta: si innescherebbe anche dopo un avvio "normale", non solo in caso di guasto, giusto ?
La soluzione proposta da @gf_ ha funzionato bene per la nostra situazione con Clickhouse su CentOS7. Clickhouse si blocca un po 'regolarmente su di noi, quindi dovevamo riavviarlo automaticamente e ricevere una notifica al riavvio. Mentre sembra un po 'ingombrante aggiungere un secondo servizio a systemd, questo è necessario a causa della progettazione di systemd.
Detto questo, questa soluzione, quando combinata con il riavvio automatico, ha smesso di funzionare per noi quando abbiamo implementato CentOS8. Questo perché systemd v239 fornito in C8 ha introdotto una modifica alla OnFailure=
semantica quando combinato con una configurazione non predefinita di Restart=
( Restart=on-failure
nel nostro caso). Il nuovo OnFailure=
comportamento attiva il servizio one-shot solo se il riavvio è fallito completamente, non solo dopo un arresto anomalo. Questo nuovo comportamento avrebbe felicemente riavviato il servizio, ma non avremmo ricevuto l'e-mail perché OnFailure=
non veniva più invocata.
Nota le nostre aspettative principali: volevamo che systemd riavviasse il processo e inviasse una notifica via e-mail. L'aggiornamento v239 ha reso la nostra soluzione precedente citata da gf_ non funziona più. Fortunatamente siamo riusciti a farlo funzionare.
La nostra soluzione è utilizzare ExecStopPost
per invocare lo script di notifica e-mail. Funziona bene, ma ora è emerso un nuovo problema: una notifica e-mail è stata inviata quando il servizio di clickhouse è stato avviato normalmente, ad esempio all'avvio del server. Pur non essendo un grosso problema, idealmente volevamo ricevere notifiche e-mail solo in caso di arresti anomali. Siamo riusciti a raggiungere questo obiettivo aggiungendo il seguente codice al nostro script di posta elettronica:
# Don't do anything if the service intentionally stopped successfully.
if [ $SERVICE_RESULT == "success" ]; then
exit
fi
... $SERVICE_RESULT
è una variabile d'ambiente fornita da systemd al processo di destinazione di ExecStopPost
. Controllando un success
risultato, supponiamo che questa invocazione provenga da un normale avvio o arresto e non faccia nulla. Su qualsiasi altro valore, come ad esempio signal
, lo script continuerebbe su un messaggio di posta elettronica. I possibili valori di questa variabile sono indicati nella documentazione .
Grazie a gf_ per la soluzione iniziale. Spero che le persone trovino utile il mio aggiornamento per CentOS8. Alcuni altri link che mi hanno aiutato:
È possibile provare a utilizzare l'opzione di servizio systemd ExecStartPost.
La descrizione è disponibile qui:
https://www.freedesktop.org/software/systemd/man/systemd.service.html
Ci possono essere più dichiarazioni di questa opzione nel file di definizione del servizio. Viene attivato uno per uno.
Avrai anche alcuni esempi nel tuo sistema.
È possibile creare uno script shell per controllare lo stato del servizio e inviare e-mail durante l'avvio del server. Questo link potrebbe aiutarti