Bagaimana saya bisa memonitor penggunaan CPU oleh pengguna?

15

Saya perlu memantau penggunaan CPU oleh pengguna dua server (Ubuntu dan CentOS). Sebagai contoh:

user1     5%
user2    10%
...

Apakah ada alat yang mirip topatau htopyang bisa melakukan itu?

Diubah Rustom
sumber
Apakah Anda perlu top untuk ditampilkan secara real time? Jika tidak, Anda bisa mempertimbangkan top -u userdan mengarahkan hasilnya ke file, lalu memantau pengguna lain. Anda kemudian akan memiliki monitor penggunaan proc untuk pengguna Anda pada interval tertentu.
Laurent C.
Kapan Anda mengatakan monitor selama periode apa? Sesekali atau terus menerus?
slm
Saya berharap dapat memonitor pengguna secara realtime seperti top.
Amged Rustom

Jawaban:

17

Berikut ini adalah skrip untuk mencetak total penggunaan CPU untuk setiap pengguna yang saat ini masuk , 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; }'

Dan di sini adalah versi yang sedikit dimodifikasi untuk mencetak penggunaan CPU dari semua pengguna yang tersedia (tetapi melewatkan yang dengan penggunaan CPU nol), 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; }'

Kolom pertama mewakili nama pengguna, kolom kedua penggunaan CPU teragregasi, dan kolom ketiga penggunaan CPU dinormalisasi menurut jumlah inti CPU.

Ada juga skrip terkait untuk menunjukkan total penggunaan memori untuk setiap pengguna: showPerUserMem.sh

Untuk pemantauan langsung, jalankan skrip ini secara berkala melalui watchperintah.

Untuk mengurutkan berdasarkan penggunaan CPU, pipa output ke sort -k2 -nr.

scai
sumber
1
mengapa Anda mencampur variabel bash env dengan variabel skrip berarti $ USER sudah ada, bahkan semua variabel caps env bukan?
Rahul Patil
Saya tidak berpikir bahwa semua variabel huruf besar harus merupakan variabel lingkungan. Tapi saya setuju bahwa menimpa variabel yang sudah ada bukanlah gaya yang sangat bagus.
scai
1
Ini umumnya ide yang buruk untuk menggunakan UPPERCASE di bash, karena alasan yang disebutkan Rahul. Lebih buruk lagi ketika Anda menggunakan nama variabel yang sudah ada sebagai nama lingkungan (n bash, $USERsudah nama pengguna Anda, jadi ut sama dengan id -nuperintah yang Anda gunakan. Saya telah mengedit posting Anda untuk mengubah ini.
terdon
Menggunakan variabel huruf besar dalam skrip shell tentu bukan ide yang buruk karena sembilan dari sepuluh skrip di /etc/init.d/direktori saya juga melakukan hal ini. Sebaliknya, menimpa variabel lingkungan yang ada harus dihindari.
scai
1
Saya menambahkan versi untuk menyertakan setiap pengguna, bukan hanya yang saat ini masuk.
scai