사용자 별 CPU 사용량을 어떻게 모니터링 할 수 있습니까?


15

두 서버 사용자 (Ubuntu 및 CentOS)의 CPU 사용량을 모니터링해야합니다. 예를 들면 다음과 같습니다.

user1     5%
user2    10%
...

도구 유사한 있는가 top또는 htop그이 할 수 있습니까?


실시간으로 상단을 표시해야합니까? 그렇지 않으면 top -u user결과를 고려 하여 파일로 리디렉션 한 다음 다른 사용자를 모니터링 할 수 있습니다. 그런 다음 주어진 간격으로 사용자의 proc 사용법을 모니터합니다.
Laurent C.

당신은 몇 기간 동안 모니터를 말할 때? 가끔 또는 지속적으로?
slm

상단과 같이 실시간으로 사용자를 모니터링 할 수 있기를 바랍니다.
Amged Rustom

답변:


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 사용량이 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.


1
왜 bash env 변수를 스크립트 변수와 혼합 하는가 $ USER가 이미 존재한다는 것을 의미합니다. 모든 caps 변수가 env가 아닙니다.
Rahul Patil

모든 대문자 변수가 환경 변수라고 생각하지 않습니다. 그러나 기존 변수를 덮어 쓰는 것이 좋은 스타일이 아니라는 데 동의합니다.
scai

1
Rahul이 언급 한 이유로 bash에서 대문자를 사용하는 것은 일반적으로 나쁜 생각입니다. 이미 환경 이름으로 존재 하는 변수 이름 (n bash $USER는 이미 사용자 이름이므로 id -nu사용 중인 명령 과 동일 합니다.)을 변경하기 위해 게시물을 편집했습니다.
terdon

/etc/init.d/디렉토리에있는 10 개의 스크립트 중 9 개도이 작업을 수행하므로 쉘 스크립트에 대문자 변수를 사용하는 것은 나쁜 생각이 아닙니다 . 기존 환경 변수를 반대로 덮어 쓰는 것은 피해야합니다.
scai

1
현재 로그인 한 사용자뿐만 아니라 모든 사용자 를 포함하는 버전을 추가 했습니다.
scai
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.