Automatische E-Mail-Benachrichtigungen bei fehlgeschlagenen systemd Service

Veröffentlicht von

Kennst du das? Ein wichtiger Service auf deinem Linux-Server stürzt ab, und du erfährst erst Stunden oder Tage später davon, wenn sich plötzlich Menschen melden oder wichtige Funktionen nicht mehr verfügbar sind. In diesem Beitrag zeige ich dir, wie du automatische E-Mail-Benachrichtigungen einrichtest, die dich sofort informieren, wenn ein systemd Service fehlschlägt.

Warum ist systemd-Überwachung wichtig?

Systemd ist das Standard-Init-System der meisten modernen Linux-Distributionen. Es verwaltet Prozesse, Services und mehr. Während systemd bereits umfangreiche Logging-Funktionen bietet, fehlt eine native Möglichkeit zur Benachrichtigung bei auftretenden Problemen.

Besonders bei kritischen Services wie Datenbank- oder Webservern kann ein schnelles Eingreifen den Unterschied zwischen einer minimalen Störung und einem größeren Ausfall bedeuten.

Die Benachrichtigungslösung

Unsere Lösung besteht aus zwei Komponenten:

  1. Einem systemd Service, der bei Fehlern aktiviert wird
  2. Einem Shell-Skript, das den Status sammelt und per E-Mail versendet

Schritt 1: Erstelle den Benachrichtigungs-Service

Erstelle zunächst die Service-Datei, die für die E-Mail-Benachrichtigungen zuständig sein wird:

nano /etc/systemd/system/notify-failed-email@.service

Füge folgenden Inhalt hinzu:

[Unit]
Description=E-Mail Failure Notification

[Service]
Type=oneshot
ExecStart=/usr/local/bin/systemd-email mail@example.com %i

Dieser Service ist als Template-Einheit konzipiert (erkennbar am @-Symbol), was bedeutet, dass er dynamisch den Namen des fehlgeschlagenen Services als Parameter erhält.

Schritt 2: Erstelle das E-Mail-Skript

Jetzt erstellen wir das Shell-Skript, das die Details zum Fehler sammelt und die E-Mail versendet:

nano /usr/local/bin/systemd-email

Füge folgenden Inhalt ein:

#!/bin/bash

## This script sends an email if the systemd service failes
## It collects the status output and complete logs since last start
##
## The script is mainly intended for one-shot services, e.g. called by systemd timers
## but can be used for any failed service unit.
## But depending on the runtime of the service, the logs can get big.

## Exit if command fails on non-zero status code and exit on empty variable
set -eu
## Change script return code to the last command to exit with a non-zero status
set -o pipefail

function USAGE() {
  echo "Usage: $0 <recipient e-mail address> <systemd service name>"
  exit 3
}

# Check if at least two arguments are provided, otherwise call usage
if [ $# -lt 2 ]; then
  USAGE
fi

sendmail -t <<ERRMAIL
To: $1
From: systemd@$(hostname -f) <root@$(hostname -f)>
Subject: $2
Content-Transfer-Encoding: 8bit
Content-Type: text/plain; charset=UTF-8

$(systemctl status --lines=0 "$2")
$(journalctl _SYSTEMD_INVOCATION_ID="$(systemctl show -p InvocationID --value "$2")")
ERRMAIL

Mach das Skript ausführbar:

chmod +x /usr/local/bin/systemd-email

Was macht das Skript?

Das Skript sammelt zwei wichtige Informationen:

  1. Den aktuellen Status des fehlgeschlagenen Service über systemctl status
  2. Die kompletten Logs seit dem letzten Start des Service über journalctl

Diese Informationen werden in einer E-Mail zusammengefasst und an die angegebene E-Mail-Adresse gesendet. Dadurch erhältst du nicht nur die Benachrichtigung über den Fehler, sondern auch sofort die relevanten Debugging-Informationen.

Schritt 3: Konfiguriere den zu überwachenden Service

Jetzt müssen wir nur noch den Service konfigurieren, den wir überwachen möchten. Als Beispiel nehmen wir hier den K3s Service (eine leichtgewichtige Kubernetes-Distribution). Aber du kannst dies für jeden beliebigen systemd Service einrichten:

systemctl edit k3s.service

Füge folgende Zeile im [Unit]-Abschnitt hinzu:

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

Der Platzhalter %i wird automatisch durch den Namen des fehlgeschlagenen Services ersetzt.

Wie funktioniert das Ganze?

  1. Wenn der überwachte Service (in unserem Beispiel k3s.service) fehlschlägt, aktiviert systemd die in OnFailure angegebene Unit
  2. Der notify-failed-email@.service wird mit dem Namen des fehlgeschlagenen Service als Parameter gestartet
  3. Das Skript sammelt die Status- und Log-Informationen und sendet sie per E-Mail

Voraussetzungen und Anpassungen

  • Du benötigst einen funktionierenden Mail-Transport-Agent (wie Postfix, Sendmail oder msmtp) auf deinem System
  • Ersetze mail@example.com in dem Shell Script durch deine tatsächliche E-Mail-Adresse
  • Für umfangreichere Logs könntest du die --lines-Parameter in den Befehlen anpassen

Tipps zur Erweiterung

  • Du kannst diesen Mechanismus für mehrere kritische Services einrichten
  • Für regelmäßig ausgeführte Services über systemd Timer
  • Bei sehr aktiven Services mit vielen Logeinträgen kann die Log Ausgabe begrenzt oder gefiltert werden

Fazit

Mit dieser einfachen, aber effektiven Lösung verpasst du keinen fehlgeschlagenen Service mehr auf deinem Linux-Server. Du erhältst sofortige Benachrichtigungen mit den wichtigsten Informationen, die du zur Fehlerbehebung benötigst.

Hast du bereits Erfahrungen mit systemd-Monitoring gemacht oder nutzt du andere Lösungen? Teile deine Gedanken in den Kommentaren!


Hinweis: Stelle sicher, dass du die E-Mail-Konfiguration deines Servers testest, bevor du dich auf dieses System verlässt. Ein fehlerhaftes E-Mail-Setup könnte dazu führen, dass keine Benachrichtigungen ankommen.

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert