Come inviare un'e-mail se viene riavviato un servizio systemd?


8

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?


2
Non so come farlo con systemd, ma con monit puoi farlo guardare un processo e può inviare una notifica se l'id del processo cambia.
Zoredache,

Risposte:


16

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 .serviceche 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.servicea 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.servicealla [Unit]sezione. %npassa il nome dell'unità al modello.

Fonte: archlinux wiki: systemd timer MAILTO


Ma @Dave non richiede un altro servizio. Vuole che il servizio che già utilizza sia in grado di inviare posta ad ogni avvio / riavvio. Per questo, c'è l'opzione ExecStartPost.
Jaroslav Kucera,

@JaroslavKucera Penso che questo lo decida fino all'OP ... :) Inoltre, non sono sicuro che ExecStartPostsia la scelta giusta: si innescherebbe anche dopo un avvio "normale", non solo in caso di guasto, giusto ?
gf_

Sono interessato al motivo per cui questo voto è stato votato: alzate la voce e parlate!
gf_

Perché la domanda non riguarda un altro servizio, ma la modifica del servizio esistente. Sì, ExecStartPost attiverà l'invio della posta anche all'avvio normale. Non sono a conoscenza di nulla che possa funzionare solo al riavvio.
Jaroslav Kucera,

@JaroslavKucera Beh, sembra che l'OP non sia d'accordo, ma ovviamente mantieni la tua opinione.
gf_

2

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-failurenel 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 ExecStopPostper 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 successrisultato, 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:

  1. /superuser/1360346/how-to-send-an-email-alert-when-a-linux-service-has-stopped
  2. /unix/422933/confusing-systemd-behaviour-with-onfailure-and-restart
  3. /unix/197636/run-an-arbitrary-command-when-a-service-fails


-1

È possibile creare uno script shell per controllare lo stato del servizio e inviare e-mail durante l'avvio del server. Questo link potrebbe aiutarti

/ubuntu/814/how-to-run-scripts-on-start-up


1
Questa domanda non riguarda l'avvio, ma il riavvio di un servizio, che potrebbe verificarsi un po 'di tempo dopo l'avvio. Quindi, non sono sicuro che la tua risposta possa essere di aiuto.
gf_
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.