Як я можу контролювати використання процесора користувачем?


15

Мені потрібно стежити за використанням процесора користувачами двох серверів (Ubuntu та CentOS). Наприклад:

user1     5%
user2    10%
...

Чи є інструмент, подібний topабо htopщо може це зробити?


Вам потрібен верх, щоб відображатися в режимі реального часу? В іншому випадку ви можете розглянути top -u userта перенаправити результат на файл, а потім стежити за іншим користувачем. Тоді ви матимете монітор використання програм для своїх користувачів через певний інтервал.
Лоран К.

Коли ви говорите монітор протягом якого періоду? Раз у раз чи постійно?
slm

Я сподіваюся, що зможу контролювати користувачів у режимі реального часу, як топ.
Amged Rustom

Відповіді:


17

Ось сценарій для друку загального використання процесора для кожного користувача, який зараз увійшов , 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; }'

Ось дещо змінена версія для друку використання CPU всіх доступних користувачів (але пропускаючи тих, у яких CPU використовує нуль), 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; }'

Перший стовпець представляє ім'я користувача, другий стовпець - сукупне використання процесора та третій стовпець - нормалізоване використання процесора відповідно до кількості ядер CPU.

Існує також пов'язаний сценарій для показу загального обсягу використання пам'яті для кожного користувача: showPerUserMem.sh

Для живого моніторингу просто виконайте ці сценарії періодично за допомогою watchкоманди.

Для сортування за використанням процесора підключіть висновок до sort -k2 -nr.


1
чому ви змішуєте змінну bash env зі змінною скрипту, означає, що $ USER вже існує, навіть усі змінні шапки є env, чи не так?
Рахул Патіл

Я не думаю, що всі великі регістри повинні бути змінними середовища. Але я згоден, що перезапис вже існуючих змінних не дуже приємний стиль.
scai

1
Як правило, погана ідея використовувати ПІДГОТОВКА в баші, з тієї причини, яку згадував Рахул. Ще гірше, коли ви використовуєте ім'я змінної, яке вже існує як екологічне (n bash, $USERце вже ваше ім'я користувача, тому ut - те саме, що і id -nuкоманда, яку ви використовуєте. Я відредагував ваше повідомлення, щоб змінити це.
terdon

Використання великих змінних у скриптах оболонки, безумовно, не є поганою ідеєю, оскільки /etc/init.d/це роблять і дев'ять із десяти сценаріїв у моєму каталозі. На противагу цьому слід уникати перезапису існуючих змінних середовищ.
scai

1
Я додав версію , щоб включити кожен користувач, а не тільки ті , які в даний час увійшли в систему .
SCAI
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.