Come posso monitorare l'utilizzo della CPU da parte dell'utente?


15

Devo monitorare l'utilizzo della CPU da parte degli utenti di due server (Ubuntu e CentOS). Per esempio:

user1     5%
user2    10%
...

Esiste uno strumento simile topo htopche può farlo?


Hai bisogno che la parte superiore sia visualizzata in tempo reale? Altrimenti, è possibile prendere in considerazione top -u usere reindirizzare il risultato su un file, quindi monitorare un altro utente. avresti quindi un monitor dell'utilizzo di proc per i tuoi utenti a un determinato intervallo.
Laurent C.,

Quando dici monitor in quale periodo? Di tanto in tanto o continuamente?
slm

Spero di poter monitorare gli utenti in tempo reale come top.
Modificato Rustom il

Risposte:


17

Ecco uno script per stampare l' utilizzo totale della CPU per ciascun utente attualmente connesso , 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; }'

Ed ecco una versione leggermente modificata per stampare l'utilizzo della CPU di tutti gli utenti disponibili (ma saltando quelli con un utilizzo della CPU pari a zero), 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 prima colonna rappresenta il nome utente, la seconda colonna l'utilizzo della CPU aggregata e la terza colonna l'utilizzo della CPU normalizzata in base al numero di core della CPU.

Esiste anche uno script correlato per mostrare l' utilizzo della memoria totale per ciascun utente: showPerUserMem.sh

Per il monitoraggio live, eseguire questi script periodicamente tramite il watchcomando.

Per ordinare in base all'utilizzo della CPU, reindirizzare l'output a sort -k2 -nr.


1
perché stai mescolando la variabile env bash con la variabile script significa che $ USER esiste già, anche tutte le variabili caps è env non è vero?
Rahul Patil,

Non penso che tutte le variabili maiuscole debbano essere variabili d'ambiente. Ma concordo sul fatto che sovrascrivere variabili già esistenti non è uno stile molto piacevole.
scai,

1
È generalmente una cattiva idea usare MAIUSCOLO in bash, per il motivo che ha menzionato Rahul. È anche peggio quando stai usando un nome di variabile che esiste già come nome ambientale (n bash, $USERè già il tuo nome utente, quindi è lo stesso del id -nucomando che stai usando. Ho modificato il tuo post per cambiarlo.
terdon

L'uso di variabili maiuscole negli script di shell non è sicuramente una cattiva idea, dato che anche nove script su dieci nella mia /etc/init.d/directory lo stanno facendo. Al contrario, è necessario evitare la sovrascrittura delle variabili di ambiente esistenti.
scai,

1
Ho aggiunto una versione per includere tutti gli utenti, non solo quelli attualmente connessi.
scai
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.