Ohne jetzt all die schönen Lösungen im Detail durchgesehen zu haben, möchte ich auch noch etwas Senf auf diesen Teller dazudrücken.
Systemd hat eine Option in der Unit-Section:
Dazu gibt es dann eine weiter unit die heißt:
Code: Alles auswählen
$ cat /etc/systemd/system/status-email-root@.service
[Unit]
#Description=status email for %I to root
Description=status email for %i to root
[Service]
Type=simple
ExecStart=/etc/systemd/scripts/systemd-email root@localhost %i
#User=nobody
Group=systemd-journal
Und diese Unit ruft dann das Skript:
Code: Alles auswählen
$ cat /etc/systemd/scripts/systemd-email
#!/bin/bash
/usr/sbin/sendmail -t <<ERRMAIL
To: $1
From: systemd <root@$HOSTNAME>
Subject: $2
Content-Transfer-Encoding: 8bit
Content-Type: text/plain; charset=UTF-8
$(systemctl status -a --full "$2")
ERRMAIL
auf.
Die Magie dahinter ist einfach. Jede Unit, welche "OnFailure=status-email-root@%n.service" hat ruft bei im Failure-Falle die Unit
status-email-root@%n.service auf. Wobei systemd %n mit dem gesamten Unit-Name der fehlgeschlagenen Unit ersetzt.
Bei mir wäre das z.B. für die Unit
mkbackup@daily.service (falls mein Backup fehlschlägt)
status-email-root@mkbackup@daily.service.service.
Der "Übergabeparameter" also der Instanzenname für status-email-root ist dann der Name der fehlgeschlagenen Unit
mkbackup@daily.service.
Das Skript status-emai-root@.service führt dann das Skript systemd-email mit den Übergabeparametern "root@localhost" und "
mkbackup@daily.service" aus.
Dieses Skript erzeugt in meinem Falle ein Email mit dem Absender "root@hostname" an root@localhost (Übergabeparameter!!!) und im Email wird ein Status-Dump der fehlgeschlagenen Unit verpackt.
In dieses Skript kannst du Statt dem aufbau eines Emails auch die Telegram-Notification einbauen. Der Rest bleibt gleich.
Wenn du verschiedene Empfänger je nach überwachter Unit haben willst, benötigst du "nur" für jeden Empfänger eine Unit "status-email-root@.service" status-email-user1@.service"... Und dem Skript in der Unit gibst du dann den jeweiligen User wie die Unit heißt.
Und in die zu überwachenden Units baust du dann nur die Zeile "OnFailure=status-email-root@%n.service" ein. Du kannst auch mehrere Empfänger für eine Unit angeben mit
Code: Alles auswählen
OnFailure=status-email-root@%n.service status-email-user1@%n.service
Damit du updatefest diese Anpassungen in System-Units einbaust, verwendest du für jede Unit ein sogenanntes Drop-In.
Dazu legst du in /etc/systemd/system für jede zu überwachende Unit ein Verzeichnis an, das sieht so aus:
Also der Unit-Name mit einem ".d" angehängt.
Für die Vereinfachung der Verwaltung legst du in /etc/systemd/system dann ein File mit der Endung ".conf" für jeden zu benachrichtigenden User als Drop-In an. Z.b. für root und für User1 sieht das dann so aus:
Code: Alles auswählen
cat /etc/systemd/system/ntfy-root.conf
[Service]
OnFailure=status-email-root@%n.service
Code: Alles auswählen
cat /etc/systemd/system/ntfy-user1.conf
[Service]
OnFailure=status-email-user1@%n.conf
Um cups.service mkbackup@.service (alle Instanzen) oder nur von z.B. der wöchentlichen Sicherung
mkbackup@weekly.service zu überwachen musst du eben die genannten Verzeichnisse mit dem Unit-Namen und angehängtem .d erzeugen:
Code: Alles auswählen
mkdir /etc/systemd/system/cups.service.d /etc/systemd/system/mkbackup@.service
erzeugen und darin dann die obigen Drop-Ins reinverlinken:
Code: Alles auswählen
ln -s ../ntfy-root.conf /etc/systemd/system/cups.service.d/ntfy-root.conf
ln -s ../ntfy-user1.conf /etc/systemd/system/mkbackup@.service.d/ntfy-user1.conf
Oder wenn du nur das wöchentliche Backup überwachen willst, dann
Code: Alles auswählen
ln -s ../ntfy-user1.conf /etc/systemd/system/mkbackup@weekly.service.d/ntfy-user1.conf
Danach eine
und schon sollten die Überwachungen aktiv sein.
Die Benachrichtigung kommt dann nur, wenn ein Dienst mit einem Errorcode > 0 (also ungeplantes Fehlschlagen) beendet wird. Wird ein Service ordnungsgemäß beendet (systemctl stop, oder der Dienst kommt regulär zum Ende), gibts keine Benachrichtigung.
Ich hoffe, du kannst was damit anfangen.
lg scientific