2009-04-16 3 views
1

J'ai un script bash qui détecte un composant système défaillant s'exécutant sur une boîte Unix. Le script envoie un email en cas d'échec. Le script s'exécute via une exécution toutes les minutes (via cron). Quel est le moyen le plus simple de limiter l'envoi des alertes à quelque chose comme toutes les 15 minutes?Limitation d'un script à l'envoi d'alertes

Puis-je créer/mettre à jour un fichier lorsque j'envoie une alerte et envoyer uniquement le fichier si la date du fichier est vieille de plusieurs minutes?

Répondre

2

Quelque chose comme cela pourrait fonctionner:

stamp=/tmp/mystamp 
# create stamp file, if we haven't yet 
[ ! -f $stmp ] && touch $stamp 
tmp=$(tempfile) 

# see if 15 minutes has passed... 
diff=$(echo $(date -d "15 minutes ago" +%y%d%m%H%M) - $(date -d "$(stat $tmp |grep Change |cut -d: -f2-)" +%y%d%m%H%M) |bc) 
rm $tmp 

# if we last touched the stamp file less than 15 minutes ago 
# then quit 
[ $diff -le 0 ] && exit 0 

# update the stamp file 
touch $stamp 

# do your thing... 
echo 'Warning! Warning!' |mail -s "FOOBAR" [email protected] 
1

Vous pouvez implémenter un intermédiaire pour les alertes d'envoi de script. Au lieu d'envoyer un email directement (via sendmail, une autre application de messagerie), vous pouvez l'envoyer à un autre script qui effectuera l'appel. Ce script pourrait alors suivre (en utilisant un autre fichier) la dernière fois que le courrier a été envoyé. De cette façon, vous pouvez vérifier à quelle fréquence vous les envoyez. :)

0

Si vous rencontrez l'erreur, touchez un fichier temporaire (par exemple /tmp/alert.email). Ensuite dans le script, vérifiez si le fichier existe et si c'est le cas et que le nombre de minutes est 0,15,30,45, envoyez un e-mail. Je ne suis pas sûr que cela fasse exactement ce que vous voulez. Fondamentalement, il:

  • Envoie un e-mail pas plus d'une fois toutes les 15 minutes.
  • Envoie un e-mail pour toutes les conditions d'erreur, mais pas nécessairement immédiatement.
  • Peut envoyer un message d'erreur immédiatement ou jusqu'à 14 minutes plus tard.

ont donc quelque chose plus tard comme:

#!/bin/bash 

MIN=`date '+%M'` 

if [ *ERROR_COND* ] ; then 
    touch /tmp/alert.email 
fi 

if [[ -f /tmp/alert.email && ($MIN = "15" || $MIN = "30" || $MIN = "45" || $MIN = "00") ]] ; then 
    # email here 
    rm -f /tmp/alert.email 
fi 
Questions connexes