如何按用户监视CPU使用率?


15

我需要监视两台服务器(Ubuntu和CentOS)的用户的CPU使用率。例如:

user1     5%
user2    10%
...

有没有类似的工具tophtop可以做到这一点的工具?


您需要实时显示顶部吗?否则,您可以考虑top -u user将结果重定向到文件,然后监视另一个用户。然后,您将在给定的时间间隔内监视用户的proc使用情况。
Laurent C.

当您说监视什么时间?偶尔还是连续?
slm

我希望能够像top一样实时监视用户。
Amged Rustom

Answers:


17

这是一个脚本,用于显示当前登录的每个用户的 CPU使用率, 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使用量,第三列代表根据CPU内核数进行标准化的CPU使用量。

还有一个相关的脚本可显示每个用户的内存使用量: showPerUserMem.sh

对于实时监控,只需通过 watch命令。

要按CPU使用率进行排序,请将输出传递给sort -k2 -nr


1
为什么将bash env变量与脚本变量混合意味着$ USER已经存在,即使所有caps变量都是env是吗?
Rahul Patil 2014年

我不认为所有大写变量都必须是环境变量。但是我同意覆盖已经存在的变量不是一个很好的样式。
scai 2014年

1
由于Rahul提到的原因,在bash中使用UPPERCASE通常是一个坏主意。这是更糟糕,当你使用一个变量名已经存在作为一项环境(N庆典,$USER为您的用户名了,所以UT的相同,id -nu使用的是我已经编辑您的文章,以更改此命令。
terdon

在shell脚本中使用大写变量肯定不是一个坏主意,因为我/etc/init.d/目录中十分之九的脚本也在执行此操作。相反,应避免覆盖现有的环境变量。
scai 2014年

1
我添加了一个版本,包括每一个用户,而不仅仅是那些当前已登录。
SCAI
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.