CPU kullanımını kullanıcıya göre nasıl izleyebilirim?


15

İki sunucunun (Ubuntu ve CentOS) kullanıcıları tarafından CPU kullanımını izlemem gerekiyor. Örneğin:

user1     5%
user2    10%
...

Buna benzer bir araç var mı topya da htopbunu yapabilir mi?


Gerçek zamanlı olarak görüntülenmesi için zirveye mi ihtiyacınız var? Aksi takdirde, top -u usersonucu göz önünde bulundurarak bir dosyaya yönlendirebilir ve ardından başka bir kullanıcıyı izleyebilirsiniz. daha sonra, belirli bir aralıkta kullanıcılarınız için proc kullanımını izlerdiniz.
Laurent C.

Ne zaman izleyeceğinizi söyleyin? Arada bir mi yoksa sürekli mi?
slm

Kullanıcıları top gibi gerçek zamanlı olarak izleyebilmeyi umuyorum.
Değişmiş Rustom

Yanıtlar:


17

Şu anda oturum açmış olan her kullanıcı için toplam CPU kullanımını yazdırmak için bir komut dosyası , 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; }'

Ve burada tüm kullanılabilir kullanıcıların CPU kullanımını yazdırmak için biraz değiştirilmiş bir versiyon (ancak CPU kullanımı sıfır olanları atlamak), 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; }'

İlk sütun kullanıcı adını, ikinci sütun toplu CPU kullanımını ve normalleştirilmiş CPU'nun CPU çekirdek sayısına göre kullandığı üçüncü sütunu temsil eder.

Her kullanıcı için toplam bellek kullanımını göstermek için ilgili bir komut dosyası da vardır : showPerUserMem.sh

Canlı izleme için bu komut dosyalarını düzenli aralıklarla watch komutla .

CPU kullanımına göre sıralama için, çıkışı boru hattına bağlayın sort -k2 -nr.


1
neden bash env değişkenini script değişkeni ile karıştırıyorsunuz $ USER zaten var, tüm caps değişkeni env olsa bile öyle değil mi?
Rahul Patil

Tüm büyük harfli değişkenlerin ortam değişkenleri olması gerektiğini düşünmüyorum. Ancak, mevcut değişkenlerin üzerine yazmanın çok hoş bir stil olmadığını kabul ediyorum.
scai

1
Rahul'un bahsettiği nedenden ötürü ÜSTÜNDE BÜYÜK HARF kullanmak kötü bir fikirdir. Zaten çevresel olan bir değişken adı kullandığınızda daha da kötüdür (n bash, $USERkullanıcı adınız zaten, bu yüzden ut kullandığınız id -nukomutla aynı . Bunu değiştirmek için yayınınızı düzenledim.
terdon

Kabuk komut dosyalarında büyük harf değişkenleri kullanmak kesinlikle kötü bir fikir değildir, çünkü dizinimdeki on komut dosyasından dokuzu /etc/init.d/da bunu yapıyor. Buna karşılık mevcut ortam değişkenlerinin üzerine yazmaktan kaçınılmalıdır.
scai

1
Yalnızca şu anda oturum açmış olanları değil , her kullanıcıyı içerecek bir sürüm ekledim .
scai
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.