如何记录 CPU 使用率,但仅在 CPU 使用率较高或触及特定阈值时才记录? (+格式)

如何记录 CPU 使用率,但仅在 CPU 使用率较高或触及特定阈值时才记录? (+格式)

我们如何记录 CPU 使用情况但是仅有的当某个进程的利用率高于特定阈值(例如 30% 或更高)时?

我想要实现的目标(使用 shell 脚本)或多或少是这样的

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组合更可靠。

相关内容