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?
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?
Antworten:
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 .service
wir erstellen, wird diese Argumente übergeben:
/etc/systemd/system/status-email-user@.service:
[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 status-email-user@dbus.service
ü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.service
dem [Unit]
Abschnitt hinzu. %n
Übergibt den Namen der Einheit an die Vorlage.
ExecStartPost
es die richtige Wahl ist: Es würde auch nach einem "normalen" Start ausgelöst, nicht nur im Falle eines Fehlers, richtig ?
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.
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