SHELL de calcul conso mémoire
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
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.
-
ContributeurSalut,
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 -
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 -
ModérateurSalut,
sans fichier temporaireps -e | perl -ne '/(\d+)/ and system ("ps","v",$1)' > resultatlami20j -
Contributeurarf...
je me doutais bien que c'etait crado ce que je proposais...
:'(
Phiphi -
ModérateurSalut,
ps -e c v | awk '{ print "Proces : ",$10,"|","PID : ",$1,"|","Mem : ",$9 }';-)) -
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. -
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 ... . -
ModérateurC'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...
;-)) -
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.
?? -
ModérateurRegarde 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
;-))
-
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 ? -
ok merci beaucoup l'ami20j. :))
-
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 :) -
Ok merci l'ami20j
-
ModérateurEn 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 }';-))-
ModérateurSalut,
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 erreurawk: line 1: syntax error at or near : awk: line 1: runaway string constant ",$9 } ...
-
ModérateurSalut,
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 }'
:-)) -
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 ;) -
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) -
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
-
-
ModérateurRe,
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 -
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