2010-09-30 3 views
2
#! /bin/bash 
`sqlplus -s <username>/<passwd>@dbname` << EOF 
set echo on 
set pagesize 0 
set verify off 
set lines 32000 
set trimspool on 
set feedback off 
`SELECT starts_with, SUM (total_records) total_records 
    FROM (SELECT ID, 
       (CASE WHEN ID LIKE '2%' THEN '2____' 
         WHEN ID LIKE '3%' THEN '3____' 
         WHEN ID LIKE '99%' THEN '99____' 
        END 
       ) starts_with, 
       total_records 
      FROM tr 
      where (id like '2%' or id like '3%' or id like '99%')) 
       WHERE tr.TIMESTAMP > SYSDATE - 75/1440 
       AND tr.TIMESTAMP <= SYSDATE - 15/1440 
GROUP BY starts_with; 
` 
exit; 
EOF 

1.D'abord, comment puis-je planifier l'exécution du script toutes les 1 heure?Comment envoyer un e-mail à partir d'un script Unix

2.Secondly, l'exigence est d'envoyer un e-mail à condition tels que:

si total_records < 1, puis un e-mail de notification d'alerte UP doivent être envoyés à [email protected]
Et dès que total_records est supérieur à 1, une nouvelle notification d'alerte DOWN ALERT est envoyée à [email protected]

NOTE: Jusqu'à ce que total_records> 1, aucune telle chose (pt.2) ci-dessus à suivre. Seulement, quand il total_records < 1, nous devons suivre l'étape 2.

Ici, total_records représente les transactions, donc il changera toutes les heures (comme le signifie tr.TIMESTAMP). tr représente la table de transaction.

Répondre

2

Pour exécuter le script toutes les heures à la marque 0 minutes, ajoutez une entrée à votre crontab comme ceci:

  • type crontab -e pour modifier votre crontab.
  • Ensuite, ajoutez la ligne suivante et enregistrez le crontab:

    0 * * * * myscript.sh > myscript.log 
    

Maintenant, vous avez besoin de travailler si vous devez envoyer un e-mail ou non, en fonction de vos conditions. Une façon de le faire, est d'écrire la sortie de votre commande SQL dans un fichier comme celui-ci:

#! /bin/bash 
`sqlplus -s <username>/<passwd>@dbname` <<EOF> sql.out 
set echo on 
set pagesize 0 
set verify off 
set lines 32000 
set trimspool on 
set feedback off 
`SELECT starts_with, SUM (total_records) total_records 
    FROM (SELECT ID, 
       (CASE WHEN ID LIKE '2%' THEN '2____' 
         WHEN ID LIKE '3%' THEN '3____' 
         WHEN ID LIKE '99%' THEN '99____' 
        END 
       ) starts_with, 
       total_records 
      FROM tr 
      where (id like '2%' or id like '3%' or id like '99%')) 
       WHERE tr.TIMESTAMP > SYSDATE - 75/1440 
       AND tr.TIMESTAMP <= SYSDATE - 15/1440 
GROUP BY starts_with; 
` 
exit; 
EOF 

Appliquez ensuite vos conditions sql.out en utilisant une commande grep ou wc et envoyer un e-mail à l'aide mailx (si elle est installée) ou sendmail:

if grep -q something sql.out 
then 
    # send email containing the output of the SQL statement 
    cat sql.out | mailx -s "UP ALERT" [email protected] 
fi 

#delete sql.out 
rm sql.out 
+0

im essayer ce qui suit mais bientôt envoyer un email, il se déplace hors de la boucle: '#!/bin/bash cat sql.out | alors lisez la suite do i = 'echo $ next | awk -F "|" '{print ($ 1)}' ' j =' echo $ suivant | awk -F "|" '{print ($ 2)}' ' k =' echo $ suivant | awk -F "|" '{print ($ 3)}' ' si [" $ k "== 0] alors mail -s" $ i's $ j est DOWN, veuillez prendre les mesures nécessaires "xyz @ mail.com sinon mail -s "tout va bien" [email protected] fi fait'. Donc, si la valeur n'est pas 0, il envoie un message "tout va bien – ErAB

+0

à la ligne1 et aucune autre action. Comme sur la ligne 4 nous avons la valeur ZERO comme $ k, donc il devrait aussi envoyer un email avec" $ i's $ j est DOWN, veuillez prendre les mesures nécessaires. "Il lit chaque ligne mais dès qu'il envoie un email, il sort de la boucle ou de la déclaration IF, pourquoi? – ErAB

0

Pour (1) regardez la page de manuel de cron (1). Cela fera ce que vous voulez. Pour (2) vous devrez soit émettre les emails à partir d'Oracle (voir le paquet DBMS_MAIL) ou rediriger la sortie de SQLPlus vers un fichier et traiter le fichier dans un script shell. Consultez la documentation de la commande mail (1) pour plus de détails sur la façon de procéder. Jetez un oeil aux pages de manuel de crond et sendmail.

0

1

1) Pour exécuter une commande toutes les heures il suffit d'éditer votre crontab utilisateur et ajouter:
0 * * * * command

2) Cela pourrait se faire dans beaucoup de façons. Le serveur de messagerie UNIX est-il configuré?