여기에 인쇄하는 스크립트 총 각 사용자의 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 사용량이 0 인 사용자는 건너 뛰기), 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
.
top -u user
결과를 고려 하여 파일로 리디렉션 한 다음 다른 사용자를 모니터링 할 수 있습니다. 그런 다음 주어진 간격으로 사용자의 proc 사용법을 모니터합니다.