SHELL de calcul conso mémoire

Bonjour à tous,
je débute complet en shell Unix. J'ai besoin de calculer la conso mémoire de plusieurs process.

Je commence déjà par constituer un fichier avec
ps -e >liste_proc.lst

pour afficher la conso mémoire, il faut faire :
ps v num_pid

Comment puis je faire les 2 automatiquement, c'est à dire lire le fichier "liste_proc.lst" et pour chaque ligne (pid), calculer la conso.

Merci beaucoup pour vos réponses.

17 réponses

Résumé de la discussion

Le fil porte sur la façon de calculer la consommation mémoire de plusieurs processus en lisant des PIDs depuis un fichier liste_proc.lst et en extrayant ces valeurs automatiquement. Plusieurs réponses proposent d’utiliser ps -e c v | awk pour afficher PID et mémoire, puis de lire le fichier ligne par ligne afin de traiter chaque PID et obtenir sa consommation mémoire. D’autres proposent des alternatives comme top avec -c -n 1 -b ou ps -eo pid,%mem,%cpu,args, et même des solutions Perl pour gagner en portabilité et en flexibilité. En cas d’environnement différent (AIX, shells comme zsh) et de contraintes telles que l’horodatage, les choix pratiqués varient et privilégient soit une extraction directe avec ps, soit des scripts Perl ou awk.

Bobot (l’IA à votre service)
  1. Contributeur
    Salut,

    déja, tu as "awk" qui permet de faire qques petits trucs sympa :
    teste :

    ps -e | awk '{print $1}'
    ps -e | awk '{print $4}'
    ps -e | awk '{print $1 "   " $4}'
    

    je suis sur que ca va t'aider un peu...

    ensuite, si tu utilises zsh, tu peux faire des boucles "for"...
    du genre, mais là je suis pas sûr de mon coup :
    for process in `ps -e | awk '{print $1 "   " $4}'` 
    do
    nom=`echo $process | awk '{print $2}'`
    conso=`ps -v `echo $process | awk '{print $1}'` `
    echo $nom $conso
    done


    c'est sans doute crado, je suis pas sur que ca marche, mais dans l'esprit, ca doit pas etre trop loin...

    Phiphi
    1. salut ,je pense qu'il y a plus simple que le gawk :

      top -c -n 1 -b
      ou mieux
      ps -eo pid,%cpu,%mem,args
      ps -eo %mem,pid,args
      ...
      tu pourras choisir la/les colonne/s que tu veux sans utiliser le gawk
      1. Modérateur
        Salut,

        sans fichier temporaire
        ps -e | perl -ne '/(\d+)/ and system ("ps","v",$1)' > resultat
        lami20j
        1. Contributeur
          arf...

          je me doutais bien que c'etait crado ce que je proposais...
          :'(

          Phiphi
          1. Modérateur
            Salut,
            ps -e c v | awk '{ print "Proces : ",$10,"|","PID : ",$1,"|","Mem : ",$9 }'
            ;-))
            1. Hello,

              d'abord, merci à tous pour vos réponses.

              Vos solutions fonctionnent bien. J'ai utilisé celle de Jipicy (donc merci beaucoup Jipicy). Effectivement ce n'est pas la peine de passer par un fichier temp.

              Solution super.

              Bonne journée à tous.
              1. Aïe !

                ca marche sous linux mais pas sous Aix. Je vais donc essayer de passer par un fichier temp.

                A moins que vous ayez une meilleure idée ... .
                1. Modérateur
                  C'est où que ça coince sous AIX ?

                  Décompose la ligne de commande et dis-nous ce qu'AIX n'aime pas, on devrait pouvoir adapter...

                  ;-))
                  1. en fait, la même commande ps -e c v fonctionne bien sous linux redhat4 mais pas sous Aix où il me renvoit à l'aide sur la commande ps.

                    ??
                    1. Modérateur
                      Regarde là peut être : http://www.open4host.com/faq/index.php?action=artikel&cat=13&id=88&artlang=it
                      AIX FORMAT DESCRIPTORS
                      This ps supports AIX format descriptors, which work somewhat like the formatting codes of printf(1) and printf(3). For example, the normal default output can be produced with this: ps -eo "%p %y %x %c" 
                      
                       
                      
                      CODE NORMAL HEADER
                        
                      %C pcpu %CPU
                        
                      %G group GROUP
                        
                      %P ppid PPID
                        
                      %U user USER
                        
                      %a args COMMAND
                        
                      %c comm COMMAND
                        
                      %g rgroup RGROUP
                        
                      %n nice NI
                        
                      %p pid PID
                        
                      %r pgid PGID
                        
                      %t etime ELAPSED
                        
                      %u ruser RUSER
                        
                      %x time TIME
                        
                      %y tty TTY
                        
                      %z vsz VSZ
                      ;-))
                      1. hello,
                        finalement, j'ai essayé avec la solution Perl de l'ami20j et là j'obtiens ce que je veux.
                        Il me reste juste une chose, je souhaite rajouter en début de chaque ligne du fichier résultat la date system au format YYYYMMDDHHMISS.

                        Auriez vous une idée ?
                        1. Modérateur
                          Hello,

                          je te ferrai le script ce soir ou la ligne de commande si tu la préfères.
                          je n'ai pas linux au boulot, donc je ne peux pas tester.

                          lami20j
                      2. résultat des courses,

                        j'ai la commande suivante:

                        ps -e |perl -ne '/(\d+)/ and system ("ps","v",$1)'|grep ora|awk '{system("echo `date +%C%y%m%d%H%M%S`");print " "$7-$10" "$13)' >resultat.lst

                        Ca marche bien mais ca s'affiche sur 2 lignes:
                        ex:
                        20060921093233
                        7849 oraPMON

                        et il me le faudrait sur une seule ligne.

                        merci :)
                        1. Modérateur
                          Salut,

                          Oups, j'ai oublié pour hier soir.
                          Pour ce que je pense je ne vais pas utiliser grep ou awk mais seulement perl.

                          C'est promis pour ce soir.

                          lami20j
                      3. Modérateur
                        En attendant la soluce à lami20j, volià celle adaptée de ma 1ère solution :
                        ps -e c v | awk -v var="$(date '+%G-%m-%d %k-%M-%S')" '{ print "Date = "var,"|","Proces : ",$10,"|","PID : 1,"|","Mem : ",$9 }'
                        ;-))
                        1. Modérateur
                          Salut,

                          je crois qu'il n'y a rien à dire si ta soluce fonctionne.
                          C'était à peu près la même chose, mais avec perl.
                          Si je pouvais écrire une commande avec seulement quelque caratères, ça vallait le coup ;)

                          lami20j

                          P.S. ta commande me donne cette erreur
                          awk: line 1: syntax error at or near :
                          awk: line 1: runaway string constant ",$9 } ...

                        2. Modérateur
                          Salut,

                          Le problème c'est que ma commande pour notre ami bluemantha ne marche pas sous AIX ;-((

                          Donc il lui faut absolument avec Perl ;-))

                          Pour ton erreur, j'en sais rien, chez moi ça marche bien (Mandriva 2006) :-\
                          oups désolé, mais le copier/coller a mal marché (il manquait un guillemet, une virgule et un $) :-(((((((((((((((((
                          ps -e c v | awk -v var="$(date '+%G-%m-%d %k-%M-%S')" '{ print "Date = "var,"|","Proces : ",$10,"|","PID : ",$1,"|","Mem : ",$9 }'


                          :-))
                        3. Modérateur
                          @jipicyR,

                          (il manquait un guillemet, une virgule et un $

                          Pour le guillement et la virgule je suis d'acord.
                          Il ne fallait plutôt un € au lieu de $ ?! :-)

                          Donc il lui faut absolument avec Perl
                          Bon je vois que je doit travailler un peu ;)
                        4. Modérateur
                          @jipicyIl ne fallait plutôt un € au lieu de $ ?! :-)
                          ;-D

                          Bon je vois que je doit travailler un peu ;)
                          Vi, au boulot faignasse ;-DDD

                          PS. T'as vu la FAQ ? (mise en forme Wiki)
                        5. Modérateur
                          @jipicyOups, j'ai oublié. Comme d'hab t'es plus rapide que moi :-)

                          j'ai regardé un peu aujourd'hui et j'ai remaqué.

                          Félicitations pour le travail ;)

                          La question que je me pose.
                          Celui qui écrit un tuto peux le faire lui même?

                          lami20j
                      4. Modérateur
                        Re,

                        pas jolie, mais enfin si ça marche ... ;)
                        ps -e v c |  perl -ne '@t=split /\s+/,$_;@d=localtime;$d[5]+=1900;$d[4]+=1;printf ("%02d-%02d-%02d %02d:%02d:%02d",@d[3,4,5,2,1,0]);print " | $t[10] | $t[1] | $t[9]\n";' 
                        lami20j

                        P.S. C'est une seule ligne
                        1. Bonjour,

                          Merci pour ces belles réponses, pouvez-vous m'expliquez comment je pourrez faire la somme du résultat d'un fichier de memoire.

                          cdt,
                          DZ23