Ich muss die CPU-Auslastung von Benutzern von zwei Servern (Ubuntu und CentOS) überwachen. Beispielsweise:
user1 5%
user2 10%
...
Gibt es ein ähnliches Tool top
oder htop
das kann das?
Ich muss die CPU-Auslastung von Benutzern von zwei Servern (Ubuntu und CentOS) überwachen. Beispielsweise:
user1 5%
user2 10%
...
Gibt es ein ähnliches Tool top
oder htop
das kann das?
Antworten:
Hier ist ein Skript zum Drucken der gesamten CPU-Auslastung für jeden derzeit angemeldeten Benutzer , 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; }'
Und hier ist eine leicht modifizierte Version zum Drucken der CPU-Auslastung aller verfügbaren Benutzer (wobei diejenigen mit einer CPU-Auslastung von Null übersprungen werden): 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; }'
Die erste Spalte repräsentiert den Benutzernamen, die zweite Spalte die aggregierte CPU-Auslastung und die dritte Spalte die normalisierte CPU-Auslastung entsprechend der Anzahl der CPU-Kerne.
Es gibt auch ein zugehöriges Skript zum Anzeigen der Gesamtspeicherbelegung für jeden Benutzer: showPerUserMem.sh
Für die Live-Überwachung führen Sie diese Skripte einfach regelmäßig über den watch
Befehl aus.
Um nach CPU-Auslastung zu sortieren, leiten Sie die Ausgabe an sort -k2 -nr
.
$USER
ist Ihr Benutzername bereits, also ist er derselbe wie der id -nu
Befehl, den Sie verwenden. Ich habe Ihren Beitrag bearbeitet, um dies zu ändern.
/etc/init.d/
Verzeichnis tun. Das Überschreiben vorhandener Umgebungsvariablen sollte dagegen vermieden werden.
top -u user
das Ergebnis prüfen und in eine Datei umleiten und dann einen anderen Benutzer überwachen. In einem bestimmten Intervall haben Sie dann eine Überwachung der Proc-Nutzung für Ihre Benutzer.