Solution 1 :
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 <[email protected]$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 unité pour obtenir le statut. Le .service
nous créons transmettra 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
Où utilisateur est l'utilisateur qui reçoit l'e-mail et l'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 à de nombreuses autres unités. À ce stade, vous pouvez commencer [email protected]
pour vérifier que vous pouvez recevoir les e-mails.
Ensuite, modifiez simplement le service pour lequel vous souhaitez recevoir des e-mails et ajoutez [email protected]%n.service
au [Unit]
section. %n
transmet le nom de l'unité au modèle.
Source :wiki archlinux :temporisateurs systemd MAILTO
Solution 2 :
La solution proposée par @gf_ a bien fonctionné pour notre situation d'exécution de clickhouse sur CentOS7. Clickhouse se bloque assez régulièrement sur nous, nous devions donc le faire 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 au redémarrage automatique, a cessé de fonctionner pour nous lorsque nous nous sommes déployés sur CentOS8. En effet, systemd v239 livré dans C8 a introduit une modification du OnFailure=
sémantique lorsqu'il est combiné avec une configuration autre que celle par défaut de Restart=
(Restart=on-failure
dans notre cas). Le nouveau OnFailure=
Le comportement ne déclenche le service ponctuel que si le redémarrage a complètement échoué, pas seulement après un crash. Ce nouveau comportement redémarrerait volontiers le service, mais nous n'obtiendrions pas l'e-mail sous la forme OnFailure=
n'était plus invoqué.
Notez notre attente principale :nous voulions que systemd redémarre le processus ET envoie une notification par e-mail. La mise à jour v239 a fait que notre solution précédente citée par gf_ ne fonctionnait plus. Heureusement, nous avons réussi à le faire fonctionner.
Notre solution est d'utiliser ExecStopPost
pour appeler le script de notification par e-mail. Cela fonctionne bien, mais maintenant un nouveau problème est apparu :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, idéalement, nous voulions recevoir des notifications par e-mail uniquement sur les accidents. Nous avons pu y parvenir en ajoutant le code suivant à notre script d'e-mail :
# 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
Par conséquent, nous supposons que cette invocation provient d'un démarrage ou d'un arrêt normal et ne faisons rien. Sur toute autre valeur, telle que signal
, le script continuerait sur un envoi d'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 autres liens qui m'ont aidé :
- https://superuser.com/questions/1360346/how-to-send-an-email-alert-when-a-linux-service-has-stopped
- https://unix.stackexchange.com/questions/422933/confusing-systemd-behaviour-with-onfailure-and-restart
- https://unix.stackexchange.com/questions/197636/run-an-arbitrary-command-when-a-service-fails