CPU 사용량을 어떻게 기록할 수 있습니까?오직프로세스 활용도가 특정 임계값(예: 30% 이상)을 초과하는 경우는 무엇입니까?
내가 달성하고 싶은 것은 (셸 스크립트를 사용하여) 대략 다음과 같습니다.
currCPU = $(cpu-checker)
while true; do
if(($currCPU >= 80)); then
echo "$(date +%F %R)"
$(top -n 1 | head -n 12 | tail -n 3 | replace "\n" "\n ") >> someFile.log
fi
sleep 2.5
done
# (cpu-checker) and (replace "\n" "\n ") are the
# problematic part
예상되는 출력은 (다소) 다음과 같습니다.
2020-08-03 02:31
16979 root 20 0 43188 4280 3396 R 104.3 0.0 0:00.06 super-process-1
1 root 20 0 225760 9428 6648 S 0.0 0.0 0:08.94 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.04 kthreadd
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H
2020-08-03 09:44
16979 root 20 0 43188 4280 3396 R 93.3 0.0 0:00.06 another-process
1 root 20 0 225760 9428 6648 S 0.0 0.0 0:08.94 systemd
2 root 20 0 0 0 0 S 102.0 0.0 0:00.04 random-proce
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H
나는 Ubuntu Server 16.04.4에서 몇 가지를 시도했습니다. (그것이 제가 가진 유일한 환경이기 때문입니다.)
아직까지는 해당 부분에 대해서는 아무것도 찾지 못했는데 cpu-checker
, 서식 지정 부분( replace "\n" "\n "
)에 대해서는 사용해 보았 tr "\n" "\n "
으나 sed G
소용이 없었습니다.
답변1
몇 가지 팁:
sed 's/^/ /'
줄의 모든 시작 부분을 공백으로 바꿉니다.
uptime | sed 's/.*load average: //;s/,.*//'
마지막 순간의 평균 로드 점수(CPU%)를 제공합니다. 이는 시스템이 얼마나 바쁜지를 나타내는 척도입니다.
@Paul_Pedant가 그의 의견에서 제안했듯이:
top -b -n 1 | awk '/%Cpu/ || $1 == "PID" || $1 ~ /^[0-9]+/; NR >= 12 { exit; }'
실제 CPU 비율을 제공합니다.
또는 모험심이 있고 약간의 Python 코드가 마음에 들지 않는 경우:
from __future__ import print_function
from time import sleep
last_idle = last_total = 0
with open('/proc/stat') as f:
fields = [float(column) for column in f.readline().strip().split()[1:]]
idle, total = fields[3], sum(fields)
idle_delta, total_delta = idle - last_idle, total - last_total
last_idle, last_total = idle, total
sleep(1)
with open('/proc/stat') as f:
fields = [float(column) for column in f.readline().strip().split()[1:]]
idle, total = fields[3], sum(fields)
idle_delta, total_delta = idle - last_idle, total - last_total
last_idle, last_total = idle, total
utilisation = 100.0 * (1.0 - idle_delta / total_delta)
print('%5.1f' % utilisation)
당신을 위해 읽고 /proc/stat
계산해 보세요 .
date '+%F %R'
정확히 동일한 출력을 제공합니다
echo "$(date '+%F %R')"
출력을 로그로 리디렉션할 수 있습니다.
마침내,
top -bn 1 | sed '1,/PID *USER/d' | head -3
아마도 귀하 tail
와 head
조합보다 더 신뢰할 수 있습니다.