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. 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
    1. 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. 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
      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. 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
      4. 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. 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
            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. 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. 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. Modérateur
                  Salut,
                  ps -e c v | awk '{ print "Proces : ",$10,"|","PID : ",$1,"|","Mem : ",$9 }'
                  ;-))
                  1. Contributeur
                    arf...

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

                    Phiphi
                    1. Modérateur
                      Salut,

                      sans fichier temporaire
                      ps -e | perl -ne '/(\d+)/ and system ("ps","v",$1)' > resultat
                      lami20j
                      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. 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