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

Amg*_*tom 17 cpu ubuntu centos

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

user1     5%
user2    10%
...
Run Code Online (Sandbox Code Playgroud)

是否有类似于tophtop可以做到这一点的工具?

sca*_*cai 20

这里是一个脚本打印对每个用户的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; }'
Run Code Online (Sandbox Code Playgroud)

这是一个稍微修改的版本,用于打印所有可用用户的 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; }'
Run Code Online (Sandbox Code Playgroud)

第一列表示用户名,第二列表示汇总的 CPU 使用率,第三列表示根据 CPU 内核数归一化的 CPU 使用率。

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

对于实时监控,只需通过watch命令定期执行这些脚本。

要按 CPU 使用率排序,请将输出通过管道传输到sort -k2 -nr.