Wie sende ich eine E-Mail, wenn ein systemd-Dienst neu gestartet wird?

8

Ich habe eine kritische Anwendung, die von systemd als Dienst ausgeführt wird.

Es ist so eingerichtet, dass es neu startet, sobald ein Fehler auftritt.

Wie sende ich eine E-Mail, wenn die Anwendung neu gestartet wird?

Greg
quelle
2
Ich weiß nicht, wie es mit systemd geht, aber mit monit können Sie einen Prozess überwachen lassen und eine Benachrichtigung senden, wenn sich die Prozess-ID ändert.
Zoredache

Antworten:

14

Zuerst benötigen Sie zwei Dateien: eine ausführbare Datei zum Senden der E-Mail und einen .service zum Starten der ausführbaren Datei. In diesem Beispiel ist die ausführbare Datei nur ein Shell-Skript, das Folgendes verwendet 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

Unabhängig davon, welche ausführbare Datei Sie verwenden, sollte es wahrscheinlich mindestens zwei Argumente geben, wie dies bei diesem Shell-Skript der Fall ist: die Adresse, an die gesendet werden soll, und die Einheitendatei, um den Status von zu erhalten. Das, was .servicewir erstellen, wird diese Argumente übergeben:

/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

Wobei Benutzer der Benutzer ist, dem eine E-Mail gesendet wird, und Adresse die E-Mail-Adresse dieses Benutzers ist. Obwohl der Empfänger fest codiert ist, wird die zu meldende Einheitendatei als Instanzparameter übergeben, sodass dieser eine Dienst E-Mails für viele andere Einheiten senden kann. An diesem Punkt können Sie [email protected]überprüfen, ob Sie die E-Mails erhalten können.

Bearbeiten Sie dann einfach den Dienst, für den Sie E-Mails wünschen, und fügen Sie ihn OnFailure=status-email-user@%n.servicedem [Unit]Abschnitt hinzu. %nÜbergibt den Namen der Einheit an die Vorlage.

Quelle: archlinux wiki: systemd timer MAILTO

gf_
quelle
@ Dave benötigt jedoch keinen anderen Dienst. Er möchte, dass der Dienst, den er bereits verwendet, bei jedem Start / Neustart E-Mails senden kann. Dafür gibt es die ExecStartPost-Option.
Jaroslav Kucera
@JaroslavKucera Ich denke das, um es bis zum OP zu entscheiden ... :) Außerdem bin ich mir nicht sicher, ob ExecStartPostes die richtige Wahl ist: Es würde auch nach einem "normalen" Start ausgelöst, nicht nur im Falle eines Fehlers, richtig ?
gf_
Ich bin interessiert, warum dies abgelehnt wird - bitte erheben Sie Ihre Stimmen und sprechen Sie!
gf_
Denn es geht nicht um einen anderen Dienst, sondern um eine Änderung des vorhandenen Dienstes. Ja, ExecStartPost würde das Senden von E-Mails auch beim normalen Start auslösen. Mir ist nichts bekannt, was nur beim Neustart funktionieren würde.
Jaroslav Kucera
@ JaroslavKucera Nun, es scheint, dass das OP nicht einverstanden ist, aber natürlich behalten Sie Ihre Meinung.
gf_
0

Sie können versuchen, die systemd-Dienstoption ExecStartPost zu verwenden.

Die Beschreibung finden Sie hier:

https://www.freedesktop.org/software/systemd/man/systemd.service.html

Die Deklaration der Dienstdefinitionsdatei kann weitere Deklarationen dieser Option enthalten. Es wird eins nach dem anderen ausgelöst.

Sie haben auch einige Beispiele in Ihrem System.

Jaroslav Kucera
quelle
-1

Sie können ein Shell-Skript erstellen, um den Dienststatus zu überprüfen und E-Mails zu senden, während der Server hochfährt. Dieser Link könnte Ihnen helfen

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

billcyz
quelle
1
Bei dieser Frage geht es nicht um das Booten, sondern um einen Neustart des Dienstes, der einige Zeit nach dem Booten auftreten kann. Daher bin ich mir nicht sicher, ob Ihre Antwort hilfreich ist.
gf_