web-dev-qa-db-fra.com

Le script shell doit cesser de répéter le même courrier électronique si une erreur a déjà été trouvée et envoyée

J'ai écrit un script qui cherche un mot dans le journal et envoie un e-mail si ce mot (erreur) est trouvé, le script s'exécute toutes les heures et si ce mot (erreur) est trouvé, il sera là un jour et le jour suivant, le journal recommence et une erreur peut ne pas être trouvée.

Ainsi, le script qui s'exécute toutes les heures m'envoie toutes les heures le même courrier électronique si cette erreur est détectée. Comment puis-je cesser d'envoyer après 2 ou une seule fois?.

if grep 'error' "/path to log"; then
    echo "error found" | mailx -s "error alert" email-id
fi
1
Aravind

Vous pouvez utiliser une deuxième condition qui utilise une variable (ou un fichier) comme indicateur (ou compteur).

Par exemple, pour utiliser un fichier comme indicateur, vous pouvez modifier votre script de la manière suivante:

#!/bin/bash

FLAG_FILE="/tmp/flag_file_my_error_email_script"

if grep -iq 'error' "/path/to/log" && [ ! -f "${FLAG_FILE}" ]; then
        echo "error found" | mailx -s "error alert" email-id
        touch "$FLAG_FILE"
fi

La commande touch "$FLAG_FILE" créera le fichier /tmp/flag_file_my_error_email_script utilisé comme argument dans la deuxième condition [ ! -f "${FLAG_FILE}" ]. Lisez à propos des expressions conditionnelles Bash .

Si vous souhaitez envoyer/recevoir un certain nombre d'e-mails, puis supprimer la fonction du script, vous pouvez ajouter une troisième condition, où le contenu du $FLAG_FILE sera utilisé comme compteur :

#!/bin/bash

FLAG_FILE="/tmp/flag_file_my_error_email_script"

if grep -iq 'error' "/path/to/log" && [ ! -f "${FLAG_FILE}" ] || (( $(cat "$FLAG_FILE") < 2 )); then
        echo "error found" | mailx -s "error alert" email-id
        touch "$FLAG_FILE"
        NEW_VALUE=$(( $(cat "$FLAG_FILE") + 1)) && echo "$NEW_VALUE" > "$FLAG_FILE"
fi

Notez que && a une signification de si la condition précédente renvoie true et || signifie si la condition précédente renvoie false .

Si vous souhaitez restaurer le travail "normal" du script, vous devez supprimer le $FLAG_FILE. Ce fichier sera automatiquement supprimé au redémarrage du système. Si vous souhaitez modifier ce comportement, choisissez un répertoire différent de /temp où l'utilisateur qui exécute le script dispose d'autorisations en écriture.

0
pa4080