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?
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?
Réponses:
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 .service
nous créons passera ces arguments:
/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
Où 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 status-email-user@dbus.service
à 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. %n
transmet le nom de l'unité au modèle.
ExecStartPost
c'est le bon choix: il se déclencherait également après un démarrage "normal", pas seulement en cas de panne, non ?
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-failure
dans 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 ExecStopPost
pour 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_RESULT
est une variable d'environnement fournie par systemd au processus cible de ExecStopPost
. En vérifiant un success
ré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é:
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.
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