GNU/Linux >> Linux Esercitazione >  >> Linux

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

Soluzione 1:

Per prima cosa sono necessari due file:un eseguibile per inviare la posta e un .service per avviare l'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 <[email protected]$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 dovrebbe richiedere almeno due argomenti come fa questo script di shell:l'indirizzo a cui inviare e il file unit di cui ottenere lo stato. Il .service che creiamo passerà questi argomenti:

/etc/systemd/system/[email protected]:

[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 utente è l'utente a cui è stata inviata l'email e l'indirizzo è l'indirizzo email dell'utente. Sebbene il destinatario sia hardcoded, il file dell'unità su cui eseguire il report viene passato come parametro di istanza, quindi questo servizio può inviare e-mail per molte altre unità. A questo punto puoi avviare [email protected] per verificare che tu possa ricevere le email.

Quindi modifica semplicemente il servizio per il quale desideri le email e aggiungi [email protected]%n.service al [Unit] sezione. %n passa il nome dell'unità al template.

Fonte:archlinux wiki:timer di sistema MAILTO

Soluzione 2:

La soluzione proposta da @gf_ ha funzionato bene per la nostra situazione con clickhouse su CentOS7. Clickhouse si arresta in modo piuttosto regolare su di noi, quindi dovevamo riavviarlo automaticamente e ricevere una notifica quando si verificava il riavvio. Anche se sembra un po' goffo aggiungere un secondo servizio a systemd, ciò è necessario a causa del design di systemd.

Detto questo, questa soluzione, se combinata con il riavvio automatico, ha smesso di funzionare per noi quando abbiamo implementato CentOS8. Questo perché systemd v239 distribuito in C8 ha introdotto una modifica al OnFailure= semantica se combinata 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 non è riuscito completamente, non solo dopo un arresto anomalo. Questo nuovo comportamento riavvierebbe felicemente il servizio, ma non riceveremmo l'e-mail come OnFailure= non veniva più richiamato.

Nota la nostra aspettativa principale:volevamo che systemd riavviasse il processo E inviasse una notifica via email. L'aggiornamento v239 ha fatto sì che la nostra precedente soluzione citata da gf_ non funzionasse più. Fortunatamente siamo riusciti a farlo funzionare.

La nostra soluzione è usare ExecStopPost per richiamare lo script di notifica e-mail. Funziona bene, ma ora è emerso un nuovo problema:è stata inviata una notifica e-mail quando il servizio clickhouse è stato avviato normalmente, ad esempio all'avvio del server. Anche se non è un grosso problema, idealmente volevamo ricevere solo le notifiche email sui crash. Siamo stati in grado di 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 target di ExecStopPost . Verificando la presenza di un success Di conseguenza, supponiamo che questa chiamata provenga da un normale avvio o arresto e non faccia nulla. Su qualsiasi altro valore, ad esempio signal , lo script continuerà con l'invio di un'e-mail. 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. Altri link che mi hanno aiutato:

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

Linux
  1. Come gestire i servizi Systemd con Systemctl su Linux

  2. Come creare un servizio Systemd in Linux

  3. Linux:come ottenere meno Tty con Systemd?

  4. Come confezionare un servizio Systemd?

  5. Come elencare i servizi Systemd in Linux

Come eseguire container come servizio Systemd con Podman

Come inviare e-mail crittografate in Linux

Come ho imparato a smettere di preoccuparmi e ad amare systemd

Come utilizzare Ansible per inviare un'e-mail utilizzando Gmail

Come configurare l'esecuzione automatica di uno script Python utilizzando Systemd

Come eseguire lo script della shell come servizio SystemD in Linux