GNU/Linux >> Tutoriels Linux >  >> Linux

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

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

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é :

  1. https://superuser.com/questions/1360346/how-to-send-an-email-alert-when-a-linux-service-has-stopped
  2. https://unix.stackexchange.com/questions/422933/confusing-systemd-behaviour-with-onfailure-and-restart
  3. https://unix.stackexchange.com/questions/197636/run-an-arbitrary-command-when-a-service-fails

Linux
  1. Comment créer un service Systemd sous Linux

  2. Comment écrire un script de démarrage pour Systemd ?

  3. Comment empaqueter un service Systemd ?

  4. Comment utiliser Systemd pour redémarrer un service en panne ?

  5. Comment rediriger la sortie du service systemd vers un fichier

Comment exécuter des conteneurs en tant que service Systemd avec Podman

Comment envoyer des e-mails cryptés sous Linux

Comment j'ai appris à arrêter de m'inquiéter et à aimer systemd

Comment utiliser Ansible pour envoyer un e-mail avec Gmail

Comment configurer l'exécution automatique d'un script Python à l'aide de Systemd

Comment exécuter un script Shell en tant que service SystemD sous Linux