E-Mail Benachrichtigung wenn systemd-Service nicht startet

Sobald das Starten eines Dienstes über systemd fehlschläg soll eine Benachrichtigung per E-Mail erfolgen. Das ist sowohl bei Timern sinnvoll, als auch bei Diensten die für Backupzwecke automatisiert gestoppt und später wieder gestartet werden. Dazu muss im Service im Bereich Unit der Parameter "OnFailure" gesetzt werden.

[Unit]
...
OnFailure=status-mail@%n.service
...

Im Fehlerfall wird der Service "status-mail@%n.service" gestartet, dabei gibt %n hinter '@' den Namen des fehlgeschlagenen Service wieder. Es wird also eine Instanz mit dem Namen des fehlgeschlagenen Service gestartet.

sudo nano /etc/systemd/system/status-mail@.service #without %n!

Der Service "status-mail@.service" wird unter /etc/systemd/system mit dem nachfolgenden Inhalt angelegt.

[Unit]
Description=Status Mailer Service
After=network.target

[Service]
Type=simple
ExecStart=/bin/status-mail.sh %I "Hostname: %H" "Machine ID: %m" "Boot ID: %b"

Der Service ruft wiederum einmalig das Skript "/bin/status-mail.sh" auf, welches die E-Mail an root sendet. Das Skript muss daher ausführbar sein!

sudo nano /bin/status-mail.sh

Das Skript "status-mail.sh" erstellt wie folgt eine E-Mail mit sendmail:

#!/bin/bash
MAILTO="root"
MAILFROM="status-mailer"
UNIT=$1

EXTRA=""
for e in "${@:2}"; do
  EXTRA+="$e"$'\n'
done

UNITSTATUS=$(systemctl status $UNIT)

sendmail $MAILTO <<EOF
From:$MAILFROM
To:$MAILTO
Subject:Status mail for unit: $UNIT

Status report for unit: $UNIT
$EXTRA

$UNITSTATUS
EOF

echo -e "Status mail sent to: $MAILTO for unit: $UNIT"

Zu guter letzt das Skript noch ausführbar machen:

sudo chmod +x /bin/status-mail.sh

Quellen

Northern Light Labs zerokspot