I need to monitor CPU usage by users of two servers' (Ubuntu and CentOS). For example:
user1 5%
user2 10%
...
Is there a tool similar to top
or htop
that can do that?
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. It only takes a minute to sign up.
Sign up to join this communityHere is a script to print the total CPU usage for each user currently logged in, 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; }'
And here is a slightly modified version for printing the CPU usage of all available users (but skipping the ones with a CPU usage of zero), 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; }'
The first column represents the user name, the second column the aggregated CPU usage and the third column the normalized CPU use according to the number of CPU cores.
There is also a related script for showing the total memory usage for each user: showPerUserMem.sh
For live-monitoring just execute these scripts periodically via the watch
command.
For sorting by CPU usage, pipe the output to sort -k2 -nr
.
$USER
is your username already, so ut's the same as the id -nu
command you are using. I've edited your post to change this.
/etc/init.d/
directory are doing this, too. Overwriting existing environment variables in contrast should be avoided.
top -u user
and redirect the result to a file, and then monitor another user. you would then have a monitor of proc usage for your users at a given interval.