CPU 사용량을 기록하려면 어떻게 해야 합니까? 단, CPU 사용량이 높거나 특정 임계값에 도달한 경우에만 해당합니까? (+형식)

CPU 사용량을 기록하려면 어떻게 해야 합니까? 단, CPU 사용량이 높거나 특정 임계값에 도달한 경우에만 해당합니까? (+형식)

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

아마도 귀하 tailhead조합보다 더 신뢰할 수 있습니다.

관련 정보