par utilisateur utilisation de la mémoire en pourcentage à l'aide des outils standard:
for USER in $(ps haux | awk '{print $1}' | sort -u)
do
ps haux | awk -v user=$USER '$1 ~ user { sum += $4} END { print user, sum; }'
done
ou pour plus de précision:
TOTAL=$(free | awk '/Mem:/{ print $2 }')
for USER in $(ps haux | awk '{print $1}' | sort -u)
do
ps hux -U $USER | awk -v user=$USER -v total=$TOTAL '{ sum += $6 } END { printf "%s %.2f\n", user, sum /total * 100; }'
done
La première version, résume le pourcentage de mémoire pour chaque processus, tel que rapporté par ps. La deuxième version, résume le mémoire en octets au lieu et calcule le pourcentage total par la suite, conduisant ainsi à une plus grande précision.
Il fonctionne, mais pas d'amende. Mon utilisation de la mémoire est pleine (99%), mais la somme de votre commande suite afficher moins de 15% Où avez-vous obtenu votre 99%? Je suis en utilisant free de commande et il me montre total:2047372used:2014592 Vous êtes l'interprétation de la sortie de free mal, merci de lire les réponses à similarquestions (mots-clés: buffers/cache). La sortie de ma réponse est correcte. Bonne logique, mais mon ps sur SUSE 13.2 fait des choses étranges avec de longs noms d'utilisateur, par exemple "garfieldthecat" apparaîtra comme "garfiel+", puis le résumé ne fonctionnerait pas. Aussi méfiez-vous que $USER est une variable intégrée pour l'utilisateur actuel dans la plupart des shells.
Ce one-liner a fonctionné pour moi sur au moins quatre différents systèmes Linux avec différentes distributions et versions. Il a également travaillé sur FreeBSD 10.
Sur la mise en œuvre, il n'y a pas de coquille de constructions en boucle ici; il utilise un tableau associatif dans awk de faire le regroupement & sommation.
Voici un exemple de sortie de l'un de mes serveurs exécutant une taille décente, MySQL, Tomcat et Apache. Les chiffres sont en MO.
Mise en garde: comme la plupart des solutions similaires, c'est que compte tenu de la résidente (RSS), afin de ne pas compter les segments de mémoire partagée.
Pourquoi "+0.5"? awk int( ) fonction est une fonction floor. L'ajout de 0,5 fait faire le bon arrondi. Donc, si un processus est à l'aide de 3.9 MO, int(3.9) montrerait que 3. Mais int(3.9+0.5) = 4. Ah nice soigné point; désolé de ne pas l'attraper. Essayez ps --no-headers -o rss,user $(pidof R) | awk '{a[$2]+=$1;}END{for(i in a)print i" "int(a[i]/1024+0.5);}' | sort -rnk2 essayez echo "USER RSS PROCS" ; echo "-------------------- -------- -----" ; pidof R | while read PID ; do ps --no-header -o rss,user -p $PID ; done | awk '{rss[$2]+=$1;procs[$2]+=1;}END{for(user in rss) printf "%-20s %8.0f %5.0f\n", user, rss[user]/1024, procs[user];}' | sort -rnk2
par utilisateur utilisation de la mémoire en pourcentage à l'aide des outils standard:
ou pour plus de précision:
La première version, résume le pourcentage de mémoire pour chaque processus, tel que rapporté par
ps
. La deuxième version, résume le mémoire en octets au lieu et calcule le pourcentage total par la suite, conduisant ainsi à une plus grande précision.Où avez-vous obtenu votre 99%?
Je suis en utilisant
free
de commande et il me montretotal:2047372
used:2014592
Vous êtes l'interprétation de la sortie de
free
mal, merci de lire les réponses à similar questions (mots-clés: buffers/cache). La sortie de ma réponse est correcte.Bonne logique, mais mon
ps
sur SUSE 13.2 fait des choses étranges avec de longs noms d'utilisateur, par exemple "garfieldthecat" apparaîtra comme "garfiel+", puis le résumé ne fonctionnerait pas. Aussi méfiez-vous que$USER
est une variable intégrée pour l'utilisateur actuel dans la plupart des shells.OriginalL'auteur scai
Ce one-liner a fonctionné pour moi sur au moins quatre différents systèmes Linux avec différentes distributions et versions. Il a également travaillé sur FreeBSD 10.
Sur la mise en œuvre, il n'y a pas de coquille de constructions en boucle ici; il utilise un tableau associatif dans
awk
de faire le regroupement & sommation.Voici un exemple de sortie de l'un de mes serveurs exécutant une taille décente, MySQL, Tomcat et Apache. Les chiffres sont en MO.
Mise en garde: comme la plupart des solutions similaires, c'est que compte tenu de la résidente (RSS), afin de ne pas compter les segments de mémoire partagée.
MODIFIER: UN plus lisible version.
Et la sortie:
awk
int( )
fonction est une fonction floor. L'ajout de 0,5 fait faire le bon arrondi. Donc, si un processus est à l'aide de 3.9 MO, int(3.9) montrerait que 3. Mais int(3.9+0.5) = 4.Ah nice soigné point; désolé de ne pas l'attraper.
Essayez
ps --no-headers -o rss,user $(pidof R) | awk '{a[$2]+=$1;}END{for(i in a)print i" "int(a[i]/1024+0.5);}' | sort -rnk2
essayez
echo "USER RSS PROCS" ; echo "-------------------- -------- -----" ; pidof R | while read PID ; do ps --no-header -o rss,user -p $PID ; done | awk '{rss[$2]+=$1;procs[$2]+=1;}END{for(user in rss) printf "%-20s %8.0f %5.0f\n", user, rss[user]/1024, procs[user];}' | sort -rnk2
OriginalL'auteur Joshua Huber
Si votre système prend en charge, essayez d'installer et d'utiliser smem:
ou
Dans Ubuntu, smem peut être installé en tapant
OriginalL'auteur h22