我们如何记录 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
可能比你的tail
和head
组合更可靠。