IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration système Discussion :

[bash-script] statistiques de charge CPU + mémoire


Sujet :

Administration système

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 39
    Par défaut [bash-script] statistiques de charge CPU + mémoire
    bonjour à tous

    je suis en train de réaliser une petite étude comparative entre Apache et Lighttpd. On me demande de tester leur montée en charge, j'ai donc créé un petit script pour paramétrer SIEGE, lequel se charge de monter le serveur en charge en le bombardant de requêtes.

    par contre je voudrais avoir la charge CPU+Mémoire, que la prise de mesure commence un peu avant le démarrage de SIEGE et qu'elle s'arrête juste après le test de charge.

    j'ai cherché avec la commande TOP, comme ceci :
    top -d 0.5 -b | grep httpd >> /dossier/fichier.log &

    et c'est là que je galère : pour httpd il y a un bonne vingtaine de lignes correspondant à des processus différents, alors que pour lighty il n'y a qu'une seule ligne
    d'autre part, entre chaque exportation de données de top dans le fichier log il n'y a pas de séparateur.

    comment dois-je procéder ? récupérer toute une séquence de lignes httpd et additionner leurs valeurs de charge CPU pour obtenir une stat qui tient la route ?

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 39
    Par défaut
    n'ayant pas eu de réponse, je me suis orienté vers une autre approche avec la fonction top à intervalle d'une demi-seconde :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    top -d 0.5 -b | grep "load average" >> /tmp/cpu.log
    ensuite il me faut traiter ce fichier log temporaire pour en extraire les données qui m'intéressent, et c'est là que je bute...

    j'ai trouvé une commande qui me permet de lire le fichier log "ligne à ligne" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cat /tmp/cpu.log | awk 'NR==1 {print}'
    (NR==1 est le n° de ligne)

    tapée en console, cette fonction marche très bien, par contre dans mon script au sein d'une boucle "for" ça ne veut pas marcher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #comptage du nombre de ligne dans le fichier
    lignecpu=`cat /tmp/cpu.log | wc -l`
     
    #affichage du fichier log ligne à ligne
    for ((j=1; j<=$lignecpu; j+=1))
    do
    toto=`cat /tmp/cpu.log | awk 'NR==$j {print}'`
    echo "$toto"
    done
    en console j'ai des lignes vierges qui s'affichent, le NR==$j ne veut pas fonctionner. par conre si je remplace $j par une valeur numérique, il me lit bien la ligne correspondante dans le fichier log...

    help plize ^^

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Bonjour,

    awk sait lire les fichiers (pas besoin de boucle shell)

    uptime donne aussi la charge moyenne de la machine.
    C'est peut-être plus rapide que top, et plus facile à parser
    Code non testé : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
     
    declare -i chargeTotale
    nbC=25 #nombre de boucles à effectuer
    while [ ${cycle:-0} -lt $nbC ]
    do charge=$(bc <<<"$charge + $(LC_NUMERIC=C uptime | awk -F':' '{sub(", .*","",$4; print $4}') )
       ((cycle++))
       sleep 1
    done
    echo $charge
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 39
    Par défaut
    j'étais parti sur UPTIME au départ, mais le problème était de déterminer la durée de la boucle... la fonction TOP (avec -b) quand à elle boucle naturellement sur elle même, il suffit juste d'arrêter le processus une fois que SIEGE se termine.
    D'autre part j'ai besoin de récup la charge mémoire aussi, ce que TOP permet alors que si j'utilise UPTIME je suis obligé de faire un FREE en prime.

    Merci pour ton code ci-dessus, mais à vrai dire je n'ai pas tout compris, beaucoup de chose que je ne connais pas comme la syntaxe de ton awk, fonction LC_NUMERIC etc...

    pour info voici mon script (ci-dessous). comme tu peux le voir il est bien avancé puisqu'il fait déjà presque le café, il n'y a que 2 petits problèmes qui restent à résoudre pour le traitement des logs temporaires (voir les commentaires qui sont dedans), notamment le NR==$j auquel je faisait allusion dans mon post précédant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    #!/bin/bash
     
    clear
    # effacement du précédant fichier top.log
    rm -f /siegelog/tmp/cpu.log 2> /dev/nul
    rm -f /siegelog/tmp/mem.log 2> /dev/nul
    rm -f /siegelog/tmp/result.log 2> /dev/nul
     
    # boucle de temporisation
    echo -e "attente de 60 sec afin de stabiliser la prise de mesure CPU+Mémoire\n"
    sleep 1
    echo -e "charges CPU+Mémoire stabilisées, début du test\n"
     
    # lancement de 2 TOP en tache de fond
    # rafraichissement toutes les 0.5 secondes
    # exportation des données CPU dans /siegelog/tmp/cpu.log
    top -d 0.5 -b | grep "load average" >> /siegelog/tmp/cpu.log &
    # exportation des données Mémoires dans /siegelog/tmp/mem.log 
    top -d 0.5 -b | grep "Mem:" >> /siegelog/tmp/mem.log &
    echo "enregistrement de données dans les log : initialisé"
     
    # temporisation de 0.5 sec afin d'avoir une mesure avant le début du test avec SIEGE
    sleep 0.5
     
    # lancement du test avec SIEGE
    siege -d0 -r100 -c30 -l/siegelog/tmp/result.log http://127.0.0.1:80
     
    # recherche des 2 processus TOP avec une boucle while et arret (destruction)
    # rappel, les quotes inversés indiquent à Bash d'executer
    i=1
    while [ $i -le 2 ]
    do
    #echo -e "test suppression process $i\n"
    pidtop=`ps aux | grep "top -d 0.5" | awk -F' ' '{ print $2 }' | head -n1`
    kill -9 $pidtop
    let i=$i+1
    done
     
    # verification que TOP a bien été arreté
    echo "vérification des processus top actifs en tache de fond"
    ps aux | grep "top -d 0.5"
     
    # ***************************************************************
     
    # traitement des logs temporaires
    lignecpu=`cat /siegelog/tmp/cpu.log | wc -l`
    echo "il y a $lignecpu lignes"
     
    # recupération des valeurs cpu+ram de la 1ere ligne des logs
    basecpu=`cat /siegelog/tmp/cpu.log | awk 'NR==1 {print}' | awk -F, '{print $4}' | awk -F' ' '{print $3}'`
    baseram=`cat /siegelog/tmp/mem.log | awk 'NR==1 {print}' | awk -F, '{print $3}' | awk -F' ' '{print $1}' | sed s/k/''/`
    echo "valeur de base CPU = $basecpu"
    echo "valeur de base RAM = $baseram"
     
    for ((j=1; j<=$lignecpu; j+=1))
    do
    # echo "n° de ligne = $j"
     toto=`cat /siegelog/tmp/cpu.log | awk 'NR==$j {print}'`
    # ******************* c'est ici que ça merdouille : $j reste vide, et le echo de $toto ci-dessous affiche des lignes blanches (vides) ****************
     echo "$toto"
    done # positionnement temporaire, ce DONE sera a déplacer apres la concaténation des résultats une fois les prbs résolus
     
    # ************ NR==10 est une valeur temporaire à remplacer par NR==$j si on trouve une soluce *********
    # recup de l'heure
    heure=`cat /siegelog/tmp/cpu.log | awk 'NR==10 {print}' | awk -F' ' '{print $3}'`
    # recup du load-average
    loadcpu=`cat /siegelog/tmp/cpu.log | awk 'NR==10 {print}' | awk -F, '{print $4}' | awk -F' ' '{print $3}'`
    # recup de la charge mémoire
    loadmem=`cat /siegelog/tmp/mem.log | awk 'NR==10 {print}' | awk -F, '{print $3}' | awk -F' ' '{print $1}' | sed s/k/''/`
     
    let consocpu=loadcpu-basecpu
    let consoram=baseram-loadmem
     
    # ******* erreur avec le calcule de consocpu, je ne comprend pas pkoi car ça marche tres bien pour consoram *******
    echo "concaténation = heure:$heure - CPU:$consocpu - RAM:$consoram ko"
    # concaténation à exporter dans un fichier LOG définitif et nominatif
     
    # sortie
    echo -e "\n  *** fin du script ***\n"
    exit

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    tu devrais mettre le nom des fichiers dans des variables, pour éventuellement n'avoir à changer le nom qu'à un seul endroit, et ainsi éviter les erreurs.

    mieux vaut faire un test (afin qu'il n'y ait pas d'erreurs), que de rediriger les erreurs vers /dev/null (avec deux l).

    n'utilise pas cat. awk peut lire les fichiers.

    awk | awk, grep | grep

    ne parse pas la sortie de ps, utilise directement pkill.

    ...
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 39
    Par défaut
    merci pour le "null" avec 2 L , j'avais pas fait gaffe

    merci pour la commande pkill, je en connaissais pas, ça simplifie effectivement les choses

    par contre concernant la fonction awk, j'ai cherché un peu dans le man, mais j'ai pas trouvé d'exemple précis pour une lecture directe d'un fichier "en mode ligne à ligne"
    (je rapelle que je lis en parallèle 2 fichiers afin de concaténer les infos avec les n° de lignes correspondants)...
    j'avoue être un peu perdu
    pourrais-tu me donner la syntaxe du awk stp ?

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    comme grep, sed, et d'autres, awk lit les fichiers directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{commandes ...}' fichier
    mais pourquoi deux fichiers ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ficLog=fichier.log
    top -d .5 -b | awk -v log="$ficLog" '/(load average|Mem):/{ print >log}' &
    siege [...]
    sleep .5
    pkill top
     
    awk '/load average:/{ calcul load average }; /Mem:/{ calcul memoire }' "$ficLog"
    c'est à peu près tout.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 39
    Par défaut
    je me suis arraché les cheveux toute la soirée sur ton code, cherché des manuels sur awk qui expliquent tes expression et j'avoue que je patauge complètement : les tutos spécialisés sur awk que j'ai trouvé m'ont plus embrouillé qu'éclairé, cette fonction est largement plus complexe que les 3 lignes de cours que j'ai eu à l'IUT dans le cadre de ma formation accélérée.


    Aussi j'aimerais avoir des détails

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    awk '{commandes ...}' fichier
    ça c'est ok, merci pour l'info


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ficLog=fichier.log
    top -d .5 -b | awk -v log="$ficLog" '/(load average|Mem):/{ print >log}' &
    1/ je suppose que fichier.log est à remplacer par le path de mon fichier (voir mon script ci-dessous), et comme tu le disais dans ton précédent message, il vaut mieux le mettre dans une variable afin d'éviter les erreurs, en l'occurrence "fichLog"

    2/ d'après une doc que j'ai trouvé, -v : Définie une variable utilisée à l'intérieur du programme...
    on avait mis le path du fichier Log dans une variable, et là on est obligé de le re-transférer dans une autre variable ???

    3/ '/(load average|Mem):/'
    tjrs d'après ma doc, ce qui se trouve entre les "/" est considéré comme une expression régulière, mais ça ne m'éclaire pas bcp. qu'est-ce que c'est sensé faire ? récupérer les valeurs de "load average" et "Mem", du moins les lignes complètes où ils sont présents dans "top" ?

    4/ { print >log}
    je suppose que le résultat de la sélection est imprimé dans le fichier Log

    -------------

    J'ai essayé d'intégrer cette fonction dans mon script version light :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    #!/bin/bash
     
    clear
    # effacement du précédant fichier log temporaire
    rm -f /siegelog/tmp/mesures.log 2> /dev/null
    rm -f /siegelog/tmp/result.log 2> /dev/null
     
    # boucle de temporisation
    echo -e "attente de 1 sec afin de stabiliser la prise de mesure CPU+Mémoire (test)\n"
    echo -e "attente de 60 sec dans la version finale\n"
    sleep 1
    echo -e "charges CPU+Mémoire stabilisées, début du test\n"
     
    # lancement de TOP en tache de fond
    # rafraichissement toutes les 0.5 secondes
    # exportation des données CPU+Mémoire dans /siegelog/tmp/mesures.log
    ficLog=/siegelog/tmp/mesures.log
    top -d .5 -b | awk -v log="$ficLog" '/(load average|Mem):/{ print >log }' &
    echo "initialisation de l'enregistrement des données dans les log : OK"
     
    # temporisation de 0.5 sec afin d'avoir une mesure avant le début du test avec SIEGE
    sleep 0.5
     
    # lancement du test avec SIEGE
    siege -d0 -r20 -c10 -l/siegelog/tmp/result.log http://127.0.0.1:80
     
    # Destruction du processus TOP
    pkill top
     
    # traitement du fichier log à faire...
    Et là c'est le drame :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    awk: /(load average|Mem):/{ print >log }
    awk:                                   ^ syntax error
    ** SIEGE 2.71b3
    ** Preparing 10 concurrent users for battle.
    The server is now under siege...
    [error] socket: unable to connect sock.c:222: Connection refused
    [error] socket: unable to connect sock.c:222: Connection refused
    [error] socket: unable to connect sock.c:222: Connection refused
    [error] socket: unable to connect sock.c:222: Connection refused
    ...même message sur environ 100 lignes, suivi des résultats de SIEGE et fin du script
    Je ne parviens pas à trouver la solution pour que ça fonctionne

    de fait je n'ai pour l'instant pas pu tester ta fonction de lecture ligne à ligne + traitement. il me reste la journée de mardi pour finir, livraison du projet pour mercredi, je commence à avoir le dos au mur et j'espère que tu verras mon message...

  9. #9
    Expert confirmé
    Avatar de Katyucha
    Femme Profil pro
    DevUxSecScrumOps Full Stack Bullshit
    Inscrit en
    Mars 2004
    Messages
    3 287
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Irlande

    Informations professionnelles :
    Activité : DevUxSecScrumOps Full Stack Bullshit

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 287
    Par défaut
    Je te conseille de regarder du coté de "sar" et "nmon"(il existe une version linux).
    Y a plein d'outils à coté pour faire de belles stats avec graphiques kikoolol qui font plaisir aux chefs

  10. #10
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    1/ oui
    2/ oui, car les commandes awk sont exécutées entre apostrophes, qui ne permettent pas le développement des variables shell.
    3/ oui
    4/ oui.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    awk: /(load average|Mem):/{ print >log }
    awk:                                   ^ syntax error
    ouaip
    j'avais changé le nom de la variable awk par souci de clarté sans refaire un test.
    log est une fonction mathématique de awk, et il ne comprend pas la redirection vers une fonction (on ne peut pas lui en vouloir).
    En mettant un majuscule au nom de la variable awk, ça passe.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Citation Envoyé par N_BaH Voir le message
    2/ oui, car les commandes awk sont exécutées entre apostrophes, qui ne permettent pas le développement des variables shell.
    Oui et non

    Tu peux très bien initialisé la variable directement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    top -d .5 -b | awk -v ficLog=fichier.log '/(load average|Mem):/{ print >ficlog }'
    Ou encore, l'initialiser via le shell et l'exclure de la syntaxe de "awk" en sortant de l'expression (en fermant la quote simple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ficLog=fichier.log
    top -d .5 -b | awk '/(load average|Mem):/{ print >'"${ficlog}"' }'

  12. #12
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    mettre le chemin du fichier log dans une variable du shell, c'est parce qu'on va s'en servir plusieurs fois dans le script.

    quant à l'usage de l'option -v, c'est comme un gros panneau : «Attention ! passage de variable»
    et je me dis, qu'un jour, un débutant va passer, prendre le code, oublier les apostrophes, et revenir en whineant : "oui, heu, mais ça marche pô "

    --
    pour la petite histoire, il est également possible de créer des variables awk sans l'option -v
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    top -d .5 -b | awk '/(load average|Mem):/{print > Log}' Log="$ficLog"  &
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  13. #13
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 39
    Par défaut
    merci pour vos réponses car franchement la soirée/nuit derniere j'étais franchement dans les choux

    concernant les erreurs de connexion, je me suis finalement rendu compte qu'en tant que gros boulet j'avais juste oublié de copier/coller les 2 lignes qui lancent les services httpd et lighttpd depuis mon script complet

    pour la fonction awk j'ai testé vos codes et voici ce que ça me donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    #!/bin/bash
    service httpd start
    service lighttpd start
    clear
    # effacement des précédants fichiers log temporaires
    rm -f /siegelog/tmp/ficlog 2> /dev/null
    rm -f /siegelog/tmp/result.log 2> /dev/null
     
    # boucle de temporisation (60 sec dans la version finale)
    sleep 1
    echo -e "fin de la temporisation, demarrage de TOP "
     
    # lancement de TOP en tache de fond - refresh 0.5 sec
    ficlog='/siegelog/tmp/ficlog'
    top -d .5 -b | awk '/(load average|Mem):/{ print >'"${ficlog}"' }'
     
    # temporisation 0.5 sec afin d'avoir une mesure avant le début du test avec SIEGE
    sleep 0.5
    echo -e "TOP initialisé, démarrage de SIEGE "
     
    # lancement du test avec SIEGE
    siege -d0 -r20 -c10 -l/siegelog/tmp/result.log http://127.0.0.1:80
     
    # Destruction du processus TOP
    echo -e "SIEGE terminé, destruction de TOP"
    pkill top
     
    # ***************************************************************
    # traitement des logs temporaires
    # a faire
    # ***************************************************************
    # sortie
    echo -e "\n  *** fin du script ***\n"
    exit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    root@VM-Fedora15-Morby Scripts]# ./testlog2.sh 
    fin de la temporisation, demarrage de TOP 
    awk: (FILENAME=- FNR=1) fatal: division by zero attempted
    TOP initialisé, démarrage de SIEGE 
    ** SIEGE 2.71b3
    ** Preparing 10 concurrent users for battle.
    The server is now under siege..      done.
    
    Transactions:		         200 hits
    Availability:		      100.00 %
    Elapsed time:		        7.86 secs
    Data transferred:	        0.15 MB
    Response time:		        0.39 secs
    Transaction rate:	       25.45 trans/sec
    Throughput:		        0.02 MB/sec
    Concurrency:		        9.84
    Successful transactions:         200
    Failed transactions:	           0
    Longest transaction:	        6.90
    Shortest transaction:	        0.00
     
    SIEGE terminé, destruction de TOP
    
      *** fin du script ***
    -------------------------------------------

    j'ai aussi essayé la seconde version :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    #!/bin/bash
     
    clear
    service httpd start
    service lighttpd start
     
    # effacement des précédants fichiers log temporaires
    rm -f /siegelog/tmp/ficlog 2> /dev/null
    rm -f /siegelog/tmp/result.log 2> /dev/null
     
    # boucle de temporisation (60 sec dans la version finale)
    sleep 1
    echo -e "fin de la temporisation, demarrage de TOP "
     
    # lancement de TOP en tache de fond - refresh 0.5 sec
    top -d .5 -b | awk -v ficLog=/siegelog/tmp/ficlog '/(load average|Mem):/{ print >ficlog }'
     
    # temporisation 0.5 sec afin d'avoir une mesure avant le début du test avec SIEGE
    sleep 0.5
    echo -e "TOP initialisé, démarrage de SIEGE "
     
    # lancement du test avec SIEGE
    siege -d0 -r20 -c10 -l/siegelog/tmp/result.log http://127.0.0.1:80
     
    # Destruction du processus TOP
    echo -e "SIEGE terminé, destruction de TOP"
    pkill top
     
    # ***************************************************************
    # traitement des logs temporaires
    # a faire
    # ***************************************************************
    # sortie
    echo -e "\n  *** fin du script ***\n"
    exit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    fin de la temporisation, demarrage de TOP 
    awk: (FILENAME=- FNR=1) fatal: expression for `>' redirection has null string value
    TOP initialisé, démarrage de SIEGE 
    ** SIEGE 2.71b3
    ** Preparing 10 concurrent users for battle.
    The server is now under siege..      done.
     
    Transactions:		         200 hits
    Availability:		      100.00 %
    Elapsed time:		        0.82 secs
    Data transferred:	        0.15 MB
    Response time:		        0.03 secs
    Transaction rate:	      243.90 trans/sec
    Throughput:		        0.18 MB/sec
    Concurrency:		        6.51
    Successful transactions:         200
    Failed transactions:	           0
    Longest transaction:	        0.10
    Shortest transaction:	        0.00
     
    SIEGE terminé, destruction de TOP
     
      *** fin du script ***
    misère


    Katyucha > j'avais effectivement dans l'idée de construire un graphique pour représenter l'évolution des charges mémoire et CPU pendant la durée du test, le tout dans une page HTML de résultat. mais vu que déjà je ne m'en sort pas pour l'exportation des prises de mesures, vu le temps qu'il me reste ça va etre chaud bouillant pour m'attaquer à de nouveaux outils que je ne connais pas. Déja créer des fichiers log temporaires corrects, pouvoir les lire et les condenser dans un fichier log définitif facilement lisible serait déjà bien.

  14. #14
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    /siegelog/tmp/ficlog ? ce chemin existe-t-il quand tu lances la commande top ?
    c'est bizarre un répertoire de ce type à la racine du système de fichier.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  15. #15
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 39
    Par défaut
    Les répertoires /siegelog/tmp/ existent, je les ai créé manuellement afin d'y accueillir les résultats avec des droits 777 pour pas etre embeté si jamais je devais lancer le script en user plutot qu'en root
    drwxrwxrwx. 3 root root 4096 8 avril 12:11 siegelog
    drwxrwxrwx. 2 morby morby 4096 10 avril 15:45 tmp
    c'était plus simple pour moi que d'aller fouiner dans l'arborescence du dossier /temp standart

    ficlog est le fichier qui récupère les logs temporaires en sortie de TOP, il est sensé etre détruit (précédente mesure) au démarrage du script, et re-créé vierge lorsque TOP démarre.

  16. #16
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 39
    Par défaut
    j'ai tout revérifié et refait des copier-coller des url, et miracle : ça fonctionne ^^
    surement une petite erreur tout bête

    voici ce que ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    # effacement des précédants fichiers log temporaires
    rm -f /siegelog/tmp/ficlog 2> /dev/null
    rm -f /siegelog/tmp/result.log 2> /dev/null
     
    # boucle de temporisation (60 sec dans la version finale)
    sleep 1
    echo -e "fin de la temporisation, demarrage de TOP "
     
    # lancement de TOP en tache de fond - refresh 0.5 sec
    ficlog=/siegelog/tmp/ficlog
    top -d .5 -b | awk '/(load average|Mem):/{print > Log}' Log="$ficlog"  &
    # temporisation 0.5 sec afin d'avoir une mesure avant le début du test avec SIEGE
    sleep 0.5
    echo -e "TOP initialisé, démarrage de SIEGE "
     
    # lancement du test avec SIEGE
    siege -d0 -r50 -c20 -l/siegelog/tmp/result.log http://127.0.0.1:80
     
    # Destruction du processus TOP
    echo -e "SIEGE terminé, destruction de TOP"
    pkill top
    et le fichier log généré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    top - 17:31:10 up 13:39,  2 users,  load average: 0.57, 0.40, 0.21
    Mem:   1507696k total,   956216k used,   551480k free,   111396k buffers
    top - 17:31:12 up 13:39,  2 users,  load average: 2.52, 0.81, 0.34
    Mem:   1507696k total,   957132k used,   550564k free,   111396k buffers
    top - 17:31:13 up 13:39,  2 users,  load average: 2.52, 0.81, 0.34
    Mem:   1507696k total,   957544k used,   550152k free,   111396k buffers
    top - 17:31:13 up 13:39,  2 users,  load average: 2.52, 0.81, 0.34
    Mem:   1507696k total,   957916k used,   549780k free,   111396k buffers
    top - 17:31:14 up 13:39,  2 users,  load average: 2.52, 0.81, 0.34
    Mem:   1507696k total,   958188k used,   549508k free,   111404k buffers
    top - 17:31:15 up 13:39,  2 users,  load average: 2.52, 0.81, 0.34
    Mem:   1507696k total,   958592k used,   549104k free,   111404k buffers
    top - 17:31:16 up 13:39,  2 users,  load average: 2.52, 0.81, 0.34
    Mem:   1507696k total,   959088k used,   548608k free,   111404k buffers
    top - 17:31:17 up 13:39,  2 users,  load average: 4.00, 1.15, 0.45
    Mem:   1507696k total,   959592k used,   548104k free,   111404k buffers
    top - 17:31:18 up 13:39,  2 users,  load average: 4.00, 1.15, 0.45
    Mem:   1507696k total,   959840k used,   547856k free,   111404k buffers
    top - 17:31:18 up 13:39,  2 users,  load average: 4.00, 1.15, 0.45
    Mem:   1507696k total,   959480k used,   548216k free,   111404k buffers


    je vais donc maintenant plancher sur ta fonction de lecture avec awk :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    awk '/load average:/{ calcul load average }; /Mem:/{ calcul memoire }' "$ficLog"

  17. #17
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    c'était plus simple
    moi aussi, je vais faire comme ça : ce soir je passe par le balcon pour rentrer chez moi ( c'est plus simple que de passer par le hall, prendre l'ascenseur... )
    pour info, j'habite au deuxième

    c'est quand même un peu jouer avec le feu.

    il vaut mieux supprimer les fichiers temporaires avant la fin du script, plutôt qu'au début.

    dans le premier cas, il faut ajouter des guillemets (c'est sans fin), comme si on utilisait le chemin en dur (/siege/tmp/ficlog) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    top -d .5 -b | awk '/(load average|Mem):/{ print >"'"${ficlog}"'" }'
    et dans le deuxième cas (j'avais pas vu la première fois), c'est ficLog, et non ficlog.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  18. #18
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    awk: (FILENAME=- FNR=1) fatal: division by zero attempted
    Ça c'est normal, il faut quoter le nom du fichier.

    Par contre un { print > "ficlog" } ne suffit pas, bizarrement le fichier reste vide
    De même si on redirige en fin de commande

    Si on enlève la redirection vers le fichier, l'affichage se fait bien sur le terminal.

    La seule alternative que j'ai trouvé c'est comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # lancement de TOP en tache de fond - refresh 0.5 sec
    top -d .5 -b | awk -v ficLog=/siegelog/tmp/ficlog '/(load average|Mem):/{ print | "cat > ficlog" }'
    Par contre dans tes exemples précédents, cette commande était lancée en arrière-plan (&), là non, c'est voulu ?

  19. #19
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 39
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    moi aussi, je vais faire comme ça : ce soir je passe par le balcon pour rentrer chez moi ( c'est plus simple que de passer par le hall, prendre l'ascenseur... )
    pour info, j'habite au deuxième

    c'est quand même un peu jouer avec le feu.

    il vaut mieux supprimer les fichiers temporaires avant la fin du script, plutôt qu'au début.

    dans le premier cas, il faut ajouter des guillemets (c'est sans fin), comme si on utilisait le chemin en dur (/siege/tmp/ficlog) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    top -d .5 -b | awk '/(load average|Mem):/{ print >"'"${ficlog}"'" }'
    et dans le deuxième cas (j'avais pas vu la première fois), c'est ficLog, et non ficlog.
    bien ô grand maitre, sur mon script final j'utiliserais le dossier /temp pour pas enjamber le balcon avec la grande échelle des pompiers, et merci pour les infos complémentaires
    merci aussi à Zippe31 pour ton intervention

    ----------------

    concernant le traitement de mon log temporaire j'ai besoin dans un premier temps d'extraire les valeurs initiales de mémoire et cpu afin de pouvoir ultérieurement faire mon calcul de conso sur l'ensemble des valeurs du fichier.
    vu que awk permet de lire sans faire de cat, j'ai donc tenté dans un premier temps de récupérer la 1ère valeur du load average (ligne 1)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    #!/bin/bash
     
    # ***************************************************************
    # traitement des logs temporaires
    ficlog=/siegelog/tmp/ficlog
     
    # recupération des valeurs cpu+ram de la 1ere ligne des logs
    awk 'NR==1 {print}' | awk -F, '{print $3}'  "$ficlog"
    echo "valeur de base CPU = $basecpu"
     
     
    # awk '/load average:/{ calcul load average }; /Mem:/{ calcul memoire }' "$ficlog"
     
    # ***************************************************************
    # sortie
    echo -e "\n  *** fin du script ***\n"
    exit
    résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    [root@VM-Fedora15-Morby Scripts]# ./lecturelog.sh 
      load average: 0.11
       537464k free
      load average: 1.70
       537464k free
      load average: 1.70
       536672k free
      load average: 1.70
       536456k free
      load average: 1.70
       535960k free
      load average: 1.70
       535952k free
      load average: 1.70
       535696k free
      load average: 1.70
       533936k free
      load average: 3.65
       536052k free
      load average: 3.65
       537212k free
    et le script ne se termine pas, obligé de sortir avec un CTRL+C



    si je fais : awk 'NR==1 {print}' "$ficlog"
    j'obtiens bien la premiere ligne complète :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    top - 17:59:42 up 14:08,  2 users,  load average: 0.11, 0.35, 0.46
    si je fais : awk -F, '{print $3}' "$ficlog"
    j'obtiens bien le 3eme champs sur la totalité du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
      load average: 0.11
       537464k free
      load average: 1.70
       537464k free
      load average: 1.70
       536672k free
      load average: 1.70
       536456k free
      load average: 1.70
       535960k free
      load average: 1.70
       535952k free
      load average: 1.70
       535696k free
      load average: 1.70
       533936k free
      load average: 3.65
       536052k free
      load average: 3.65
       537212k free
    mais le pipe que je met pour coupler les 2 sélection semble poser probleme

  20. #20
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    au pire ce serait awk fichier | awk, mais on ne pipe pas awk vers awk, on utilise une seule instance de awk !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F'[:,]' 'NR == 1{ sub("^ ","",$8); initLA = $8; print initLA}' temp.log
    ceci pourra t'aider.
    le guide de l'utilisateur aussi.

    j'ai besoin dans un premier temps d'extraire les valeurs initiales de mémoire et cpu afin de pouvoir ultérieurement faire mon calcul de conso sur l'ensemble des valeurs du fichier.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. [WD15] Charge CPU et mémoire
    Par spamoi dans le forum WinDev
    Réponses: 9
    Dernier message: 29/08/2011, 16h21
  2. [débutant] Mémoire + Charge CPU JBOSS
    Par rin01 dans le forum Wildfly/JBoss
    Réponses: 2
    Dernier message: 11/03/2010, 17h36
  3. [linux] charge cpu et mémoire.
    Par heider dans le forum Général Python
    Réponses: 8
    Dernier message: 26/10/2007, 20h12
  4. Commandes pour charge disque / CPU / Mémoire
    Par arnaudperfect dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 26/07/2007, 21h35
  5. Charge CPU avec prog opengl + win32
    Par TibobiT dans le forum MFC
    Réponses: 2
    Dernier message: 12/05/2004, 19h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo