Avez-vous besoin que top soit affiché en temps réel? Sinon, vous pouvez considérer top -u useret rediriger le résultat vers un fichier, puis surveiller un autre utilisateur. vous auriez alors un moniteur d'utilisation de proc pour vos utilisateurs à un intervalle donné.
Laurent C.20
Quand vous dites surveiller sur quelle période? De temps en temps ou en continu?
slm
J'espère pouvoir surveiller les utilisateurs en temps réel comme top.
Amged Rustom
Réponses:
17
Voici un script pour imprimer l' utilisation totale du processeur pour chaque utilisateur actuellement connecté , showPerUserCPU.sh :
own=$(id -nu)
cpus=$(lscpu | grep "^CPU(s):" | awk '{print $2}')
for user in $(who | awk '{print $1}' | sort -u)
do
# print other user's CPU usage in parallel but skip own one because
# spawning many processes will increase our CPU usage significantly
if [ "$user" = "$own" ]; then continue; fi
(top -b -n 1 -u "$user" | awk -v user=$user -v CPUS=$cpus 'NR>7 { sum += $9; } END { print user, sum, sum/CPUS; }') &
# don't spawn too many processes in parallel
sleep 0.05
done
wait
# print own CPU usage after all spawned processes completed
top -b -n 1 -u "$own" | awk -v user=$own -v CPUS=$cpus 'NR>7 { sum += $9; } END { print user, sum, sum/CPUS; }'
Et voici une version légèrement modifiée pour imprimer l'utilisation du processeur de tous les utilisateurs disponibles (mais en ignorant ceux avec une utilisation du processeur de zéro), showAllPerUserCPU.sh :
own=$(id -nu)
cpus=$(lscpu | grep "^CPU(s):" | awk '{print $2}')
for user in $(getent passwd | awk -F ":" '{print $1}' | sort -u)
do
# print other user's CPU usage in parallel but skip own one because
# spawning many processes will increase our CPU usage significantly
if [ "$user" = "$own" ]; then continue; fi
(top -b -n 1 -u "$user" | awk -v user=$user -v CPUS=$cpus 'NR>7 { sum += $9; } END { if (sum > 0.0) print user, sum, sum/CPUS; }') &
# don't spawn too many processes in parallel
sleep 0.05
done
wait
# print own CPU usage after all spawned processes completed
top -b -n 1 -u "$own" | awk -v user=$own -v CPUS=$cpus 'NR>7 { sum += $9; } END { print user, sum, sum/CPUS; }'
La première colonne représente le nom d'utilisateur, la deuxième colonne l'utilisation agrégée du processeur et la troisième colonne l'utilisation normalisée du processeur en fonction du nombre de cœurs de processeur.
Il existe également un script associé pour afficher l' utilisation totale de la mémoire pour chaque utilisateur: showPerUserMem.sh
Pour la surveillance en direct, exécutez simplement ces scripts périodiquement via la watchcommande.
Pour trier par utilisation CPU, dirigez la sortie vers sort -k2 -nr.
pourquoi vous mélangez la variable bash env avec la variable de script signifie que $ USER existe déjà, même toutes les variables majuscules sont env n'est-ce pas?
Rahul Patil
Je ne pense pas que toutes les variables majuscules doivent être des variables d'environnement. Mais je suis d'accord que l'écrasement des variables déjà existantes n'est pas un style très agréable.
scai
1
C'est généralement une mauvaise idée d'utiliser UPPERCASE dans bash, pour la raison mentionnée par Rahul. C'est encore pire lorsque vous utilisez un nom de variable qui existe déjà en tant que nom environnemental (n bash, $USERest déjà votre nom d'utilisateur, donc c'est la même chose que la id -nucommande que vous utilisez. J'ai édité votre message pour le changer.
terdon
L'utilisation de variables majuscules dans les scripts shell n'est certainement pas une mauvaise idée, car neuf scripts sur dix de mon /etc/init.d/répertoire le font également. Le remplacement des variables d'environnement existantes en revanche doit être évité.
scai
1
J'ai ajouté une version pour inclure tous les utilisateurs, pas seulement ceux actuellement connectés.
top -u user
et rediriger le résultat vers un fichier, puis surveiller un autre utilisateur. vous auriez alors un moniteur d'utilisation de proc pour vos utilisateurs à un intervalle donné.Réponses:
Voici un script pour imprimer l' utilisation totale du processeur pour chaque utilisateur actuellement connecté , showPerUserCPU.sh :
Et voici une version légèrement modifiée pour imprimer l'utilisation du processeur de tous les utilisateurs disponibles (mais en ignorant ceux avec une utilisation du processeur de zéro), showAllPerUserCPU.sh :
La première colonne représente le nom d'utilisateur, la deuxième colonne l'utilisation agrégée du processeur et la troisième colonne l'utilisation normalisée du processeur en fonction du nombre de cœurs de processeur.
Il existe également un script associé pour afficher l' utilisation totale de la mémoire pour chaque utilisateur: showPerUserMem.sh
Pour la surveillance en direct, exécutez simplement ces scripts périodiquement via la
watch
commande.Pour trier par utilisation CPU, dirigez la sortie vers
sort -k2 -nr
.la source
$USER
est déjà votre nom d'utilisateur, donc c'est la même chose que laid -nu
commande que vous utilisez. J'ai édité votre message pour le changer./etc/init.d/
répertoire le font également. Le remplacement des variables d'environnement existantes en revanche doit être évité.