Comment envoyer un email si un service systemd est redémarré?

8

J'ai une application critique qui est exécutée en tant que service par systemd.

Il est configuré pour redémarrer dès qu'il y a une panne.

Comment envoyer un email si l'application redémarre?

Greg
la source
2
Je ne sais pas comment le faire avec systemd, mais avec monit, vous pouvez le faire surveiller un processus, et il peut envoyer une notification si l'ID du processus change.
Zoredache

Réponses:

16

Vous avez d'abord besoin de deux fichiers: un exécutable pour envoyer le courrier et un .service pour démarrer l'exécutable. Pour cet exemple, l'exécutable est juste un script shell utilisant 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

Quel que soit l'exécutable que vous utilisez, il devrait probablement prendre au moins deux arguments comme le fait ce script shell: l'adresse à laquelle envoyer et le fichier d'unité pour obtenir l'état. Le que .servicenous créons passera ces arguments:

/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

utilisateur est l'utilisateur auquel un e-mail est envoyé et adresse est l'adresse e-mail de cet utilisateur Bien que le destinataire soit codé en dur, le fichier d'unité à signaler est transmis en tant que paramètre d'instance, de sorte que ce service peut envoyer des e-mails pour de nombreuses autres unités. À ce stade, vous pouvez commencer [email protected]à vérifier que vous pouvez recevoir les e-mails.

Ensuite, modifiez simplement le service pour lequel vous souhaitez recevoir des e-mails et ajoutez-le OnFailure=status-email-user@%n.serviceà la [Unit]section. %ntransmet le nom de l'unité au modèle.

Source: archlinux wiki: temporisateurs systemd MAILTO

gf_
la source
Mais @Dave n'a pas besoin d'un autre service. Il souhaite que le service qu'il utilise déjà puisse envoyer du courrier à chaque démarrage / redémarrage. Pour cela, il existe une option ExecStartPost.
Jaroslav Kucera
@JaroslavKucera Je pense que cela doit être décidé jusqu'à l'OP ... :) De plus, je ne sais pas si ExecStartPostc'est le bon choix: il se déclencherait également après un démarrage "normal", pas seulement en cas de panne, non ?
gf_
Je suis curieux de savoir pourquoi ce vote est rejeté - veuillez élever la voix et parler!
gf_
Parce que la question ne concerne pas un autre service, mais la modification d'un service existant. Oui, ExecStartPost déclencherait l'envoi de courrier même au démarrage normal. Je ne suis au courant de rien qui ne fonctionnerait qu'au redémarrage.
Jaroslav Kucera
@ JaroslavKucera Eh bien, il semble que le PO soit en désaccord, mais bien sûr, gardez votre avis.
gf_
2

La solution proposée par @gf_ a bien fonctionné pour notre situation exécutant clickhouse sur CentOS7. Clickhouse se bloque quelque peu régulièrement sur nous, nous avons donc dû le redémarrer automatiquement et être averti lorsque le redémarrage s'est produit. Bien qu'il semble un peu maladroit d'ajouter un deuxième service à systemd, cela est nécessaire en raison de la conception de systemd.

Cela étant dit, cette solution, combinée à un redémarrage automatique, a cessé de fonctionner pour nous lorsque nous avons déployé sur CentOS8. En effet, systemd v239 livré en C8 a introduit une modification de la OnFailure=sémantique lorsqu'il est combiné avec une configuration non par défaut de Restart=( Restart=on-failuredans notre cas). Le nouveau OnFailure=comportement ne déclenche le service one-shot que si le redémarrage a échoué complètement, pas seulement après un crash. Ce nouveau comportement serait heureux de redémarrer le service, mais nous n'obtiendrions pas l'e-mail car OnFailure=il n'était plus appelé.

Notez notre principale attente: nous voulions que systemd redémarre le processus ET envoie une notification par e-mail. La mise à jour v239 fait que notre solution précédente citée par gf_ ne fonctionne plus. Heureusement, nous avons pu faire fonctionner cela.

Notre solution consiste à utiliser ExecStopPostpour appeler le script de notification par e-mail. Cela fonctionne bien, mais maintenant un nouveau problème est survenu: une notification par e-mail a été envoyée lorsque le service clickhouse a démarré normalement, comme au démarrage du serveur. Bien que ce ne soit pas un gros problème, nous voulions idéalement recevoir des notifications par e-mail uniquement en cas de crash. Nous avons pu y parvenir en ajoutant le code suivant à notre script de messagerie:

# Don't do anything if the service intentionally stopped successfully. if [ $SERVICE_RESULT == "success" ]; then exit fi

... $SERVICE_RESULTest une variable d'environnement fournie par systemd au processus cible de ExecStopPost. En vérifiant un successrésultat, nous supposons que cette invocation provient d'un démarrage normal ou d'un arrêt, et ne fait rien. Sur toute autre valeur, telle que signal, le script continuerait lors de l'envoi d'un e-mail. Les valeurs possibles de cette variable sont indiquées dans la documentation .

Merci à gf_ pour la solution initiale. J'espère que les gens trouveront ma mise à jour utile pour CentOS8. Quelques liens supplémentaires qui m'ont aidé:

  1. /superuser/1360346/how-to-send-an-email-alert-when-a-linux-service-has-stopped
  2. /unix/422933/confusing-systemd-behaviour-with-onfailure-and-restart
  3. /unix/197636/run-an-arbitrary-command-when-a-service-fails
Antony Nguyen
la source
0

Vous pouvez essayer d'utiliser l'option de service systemd ExecStartPost.

La description est disponible ici:

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

Il peut y avoir plus de déclarations de cette option dans le fichier de définition de service. Il est déclenché un par un.

Vous aurez également quelques exemples dans votre système.

Jaroslav Kucera
la source
-1

Vous pouvez créer un script shell pour vérifier l'état du service et envoyer des e-mails lors du démarrage du serveur. Ce lien pourrait vous aider

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

billcyz
la source
1
Cette question ne concerne pas le démarrage, mais le redémarrage d'un service, ce qui peut se produire un certain temps après le démarrage. Par conséquent, je ne sais pas si votre réponse est utile.
gf_