Forum Programmation.shell Besoin d'aide Script d'automatisation ??

Posté par  .
Étiquettes : aucune
0
2
mai
2006
Bonjour,

Je suis stagiaire depuis peu et on m'a confié l'exploitation d'un serveur.
En 1): on m'a demandé de créer un script pour surveiller le remplissage des file system ufs du serveur et d'indiquer une alarme lorsque celui ci depasse 80%.
Ci-joint le script que j'ai fait :

#!/bin/bash

df -k ufs | grep "%" | while read script1

do
script1_NAME=`echo $script1 | awk -F' ' '{print $1}'`
script1_SIZE=`echo $script1 | awk -F' ' '{print $5}' | cut -d'%' -f1`

if test $script1_SIZE -gt 80
then
echo "`date "+%d/%m/%y" Filesystem $FS_script1 utilisé à plus de ${script1_SIZE}%" >>Alarme.log

fi
done

En 2) on me demande de créer un script pour surveiller un ou plusieurs process sur le serveur. La liste des process et leur nombre doivent se trouver ds un fichier de paramètre. A chaque fois qu'un process est manquant il faut le signaler ds le fichier alarme.log

C'est pour le 2) que j'ai besoin de votre aide. Je pense à la cde ps ainsi que grep mais C la structure de ce script que je n'arrive pas à faire.
Merci d'avance pour votre aide.
  • # A mon avis ...

    Posté par  . Évalué à 2.

    faire un while read script1 puis echo $script1 | awk -F' ' '{print $1} et script1_SIZE=`echo $script1 | awk -F' ' '{print $5}' | cut -d'%' -f1` est un peu ridicule .....

    personnellement c'est le genre de truc que je fais faire a awk.

    En gros ca donne:

    df -k ufs | awk '
    /%/ {
    sub("%","",$5)
    if($5 >80) {
    print "Filesystem " $1 "utilisé a "$5 "%"
    }
    } >>Alarme.log DATE=$(date "+%d/%m/%y")
    • [^] # Re: A mon avis ...

      Posté par  . Évalué à 2.

      Je reprend (un petit oubli):

      df -k ufs | awk '
      /%/ {
      sub("%","",$5)
      if($5 >80) {
      print DATE " Filesystem " $1 "utilisé a "$5 "%"
      }
      } >>Alarme.log DATE=$(date "+%d/%m/%y")
    • [^] # Re: A mon avis ...

      Posté par  . Évalué à 1.

      Merci pour ta reponse et la modif de la Q1. je testerai ton script pour voir si ca marche sous Solaris 10 que j'utilise.
  • # pour repondre a la question:

    Posté par  . Évalué à 2.

    Le fichier de paramètre, il a quelle forme?
    J'aurais bien une solution à base de awk ....

    en supposant que le fichier d'entrée soit de la forme:
    nom_process Nombre Commande_relance et que le fichier se nomme liste.dat.

    (exemple factice: pour sendmail):
    sendmail 2 /sbin/sendmail



    ps -e -o pid,comm | awk '{
    PROCESS[$2]++
    }
    END {
    while ((getline Line < LIST) > 0) {
    print "Line:" Line
    split(Line,tmp1)
    tabref[tmp1[1]]=tmp1[2]
    relance[tmp1[1]]=tmp1[3]
    }

    for(i in tabref) {
    printf ("Process: %s; nombre %s\n",i,PROCESS[i])
    if(tabref[i] > PROCESS[i]) {
    print "nombre Process " i " insuffisant"
    print "Relance: " relance[i]
    system(relance[i])
    }
    }
    }
    ' LIST=liste.dat | more



    Essayé sur aix 5.1 (ca marche).

    Moi j'aime bien awk ....
    • [^] # Re: pour repondre a la question:

      Posté par  . Évalué à 2.

      J'ai laissé des "print" ou des "printf" a certains endroits pour débugger: tu peux les enlever sans soucis et ne garder que ceux qui t'intéressent.
    • [^] # Re: pour repondre a la question:

      Posté par  . Évalué à 1.

      Le fichier de paramètre il est standard. Il doit contenir plusieurs process et leurs nombres tirés de la cde ps je pense.
      Ca doit etre un script répétitif et donc enregistré ds la crontab.

      MA reponse te convient-elle ??
      Je suis un peu en manque d'léments et pas très aidé par mon responsable !!
      • [^] # Re: pour repondre a la question:

        Posté par  . Évalué à 2.

        1/ Merci d'éviter les abbréviations.

        sinon, ce que je te demandais c'était le format de la liste de process et leur nombre.
        Si tu es libre du format, c'est bien: tu n'as qu'à reprendre ce que je t'ai donné ci-dessus. Sinon, il faut le format de la liste en question et éventuellement adapter le script awk que je t'ai donné pour que ça marche.

        As-tu compris ce que je t'ai donné ou as-tu besoin de plus d'explications?
        • [^] # Re: pour repondre a la question:

          Posté par  . Évalué à 1.

          Concernant le format de la liste de process j'ai pas de directive précise.
          J'en parlerai avec mon responsable.
          Il m'a juste dit tu prend 2 ou 3 process et l'important c'est que dès qu'il en manque un process il faut envoyer une alerte dans le fichier alarme.log crée dans le script1.

          Il n'y a pas de redirection vers alarme.log dans le script que tu m'a indiqué.

          Serait ce à la fin de LIST=liste.dat | more que je dois rediriger vers alarme.log ??
          • [^] # Re: pour repondre a la question:

            Posté par  . Évalué à 2.

            Oups! pardon, j'ai lu trop vite et j'ai cru qu'il fallait relancer le process! Désolé.
            En fait mon script affiche le résultat page par pagesur la sortie standard. Il te suffit donc de remplacer le |more par >>alarme.log.

            La liste sera quant a elle sous la forme:

            process_name nombre


            Pour éviter qu'il exécute une commande de relance, supprime la ligne "system( ....)". Je te laisse reformatter la sortie à ta sauce. Je pense qu'avec ce que je t'ai donné tu devrais pouvoir te débrouiller. Si tu as d'autres questions n'hésite pas.

            man ps pour voir à quoi correspondent les options utilisées pour ps. Sinon pour awk, je te conseille la lecture d'un bon bouquin sur le sujet (le bouquin O'Reilly sur sed et awk est particulièrement bien fait), la lecture des pages man ne t'aidera pas beaucoup si tu ne connais pas déjà un peu le sujet.
            • [^] # Re: pour repondre a la question:

              Posté par  . Évalué à 1.

              Je te remercie pour ces conseils.
              J'essaierai ça demain et jte dirai si ca marche ou pas.
              Malheureusement :-) des questions je vais en avoir encore d'autre car mon tuteur en a plein à me donner !! sniff, lol
              • [^] # Re: pour repondre a la question:

                Posté par  (site web personnel) . Évalué à 2.

                Si tu as des trucs plus avancés à faire au niveau surveillance de process, tu peux aussi regarder Mon (souvent utilisé avec heartbeat, mais dans ton cas ça ne semble pas nécessaire):

                http://www.regit.org/article.php3?id_article=11
                http://www.geocities.com/latompa/ha/apache_heartbeat.html

                Bon, courage, pas toujours évident les stages, mais ne te démotive pas ;-)
                • [^] # Re: pour repondre a la question:

                  Posté par  . Évalué à 1.

                  Je sais pas si tu auras mon message ?? Mais je t'envoi la copie du script que j'ai fait pour surveiller une liste de process.
                  Il ne marche pas.

                  si tu peux m'aider ?? Merci beaucoup.

                  J'ai d'abord crée un fichier de parametre appelé param comprenant ces process : bash 4
                  sshd 1
                  dtlogin 1

                  Ci dessous mon script :

                  #!/bin/bash

                  cat fichier_param | while read param
                  do
                  ps -A | grep `echo $param | awk '{print $1}'`

                  if test $? -eq 1
                  then
                  echo "`date "+%d/%m/%y"` Process manquant $param >>Alarme.log

                  fi
                  done
                  • [^] # Re: pour repondre a la question:

                    Posté par  (site web personnel) . Évalué à 2.

                    problème 1: grep renvoie 0 s'il trouve des occurences, et 1 s'il ne trouve rien, et pas le nombre d'occurences trouvées

                    Ensuite, n'utilise pas grep, parce que si tu as les process tata et tatata tu n'arriveras pas à les différencier. Utilise plutôt pidof qui lui te retournera les PID des process que tu recherches (3 process => 3 PID).

                    Avec wc -w tu peux compter le nombre de process trouvés.

                    Et voilà, c'est fini. T'as du bol, j'avais qu'un truc urgentissime à faire ce soir... Fais chier, je dois y retourner...

                    #!/bin/bash

                    cat liste | while read process nb
                    do
                    echo "debug: Searching process: $process ($nb)"

                    nbfound=$(pidof $process | wc -w)
                    echo "debug: Found $nbfound time(s) $process"

                    if [[ $nbfound != $nb ]]
                    then
                    echo "`date "+%d/%m/%y"` Process '$process' missing (expected $nb, found $nbfound)" >> alarme.log

                    fi
                    done


                    PS:
                    la référence en cours de shell script:
                    http://www.tldp.org/LDP/abs/html/index.html (en)
                    http://www.bsdbooks.net/shells/scripting/fr/ (fr)

                    La version anglaise est la plus à jour
                    • [^] # Re: pour repondre a la question:

                      Posté par  . Évalué à 1.

                      j'ai essayé ton script mais sous solaris 10 il marche pas.

                      Le script que j'ai fait est-il modifiable ? C'est vrai que j'ai un peu de mal à tout comprendre. Et faire un script me prend beaucoup de temps. Si tu as la possibilité de m'aider sur mon script de depart ce serait sympa car il me renvoit les alertes sur alarme.log.

                      Merci d'avance.
                      en plus la pression de mon chef ca n'arrange pas.
                      • [^] # Re: pour repondre a la question:

                        Posté par  (site web personnel) . Évalué à 2.

                        bin je peux difficilement faire plus sans avoir de système solaris 10 sous la main...
                        Si en plus tu ne me dis pas ce qui foire, là pour le coup c'est impossible...

                        je te conseille un coup de bash -vx monscript.sh, ça lance un genre de mode debug pour les scripts shell... Tu vois ainsi ce que fait chaque ligne. Ensuite tente chaque ligne une par une pour voir laquelle foire. Ensuite je t'ai dit que ton script n'utilisait pas une solution viable, donc le modifier ne sert pas à grand chose si tu gardes la solution du grep...

                        De plus si tu avais essayé de comprendre mon script tu aurais vu que je renvoie aussi les alertes dans alarmes.log (oui, j'ai enlevé la majuscule). Après je me suis déjà fait ch*** à te faire un script qui fonctionne (testé sous cygwin), et je ne maitrise pas awk, donc je vais pas apprendre alors que ça sert à rien pour un script aussi simple. Je suis parti du script qui signale quand tu n'as pas le bon nombre de processus surveillés.

                        Alors ôte toi un peu les doigts du cul, tu verras que c'est pas difficile. Si tu as besoin d'aide pour comprendre les choses, pas de problème. Mais pour qu'on me dise "tu peux pas faire mon boulot à ma place et faire comme si c'était moi qui l'avais fait pour que mon maitre de stage s'en rende pas compte", faut peut être pas pousser...
                        • [^] # Re: pour repondre a la question:

                          Posté par  . Évalué à 1.

                          Désolé si mes phrases ont mal été formulées, ce n'était pas mon intention. c'est vrai que tout ça n'est pas facile et les journées sont longues. Mais je m'accroche et essai d'avancer.
                          Merci quand meme pour tes infos.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.