例如,我想知道如何使用bash获取系统CPU使用情况并以百分比表示。

样例输出:

57%

如果有多个核心,如果能计算出平均百分比就好了。


尝试sysstat包中的mpstat

> sudo apt-get install sysstat
Linux 3.0.0-13-generic (ws025)  02/10/2012  _x86_64_    (2 CPU)  

03:33:26 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
03:33:26 PM  all    2.39    0.04    0.19    0.34    0.00    0.01    0.00    0.00   97.03

然后一些cutor grepto解析你需要的信息:

mpstat | grep -A 5 "%idle" | tail -n 1 | awk -F " " '{print 100 -  $ 12}'a

看一下cat /proc/stat

使用grep的cpu /proc/stat | awk的{=(2 + 4美元)* 100 /(2 + 4 + 5美元美元)}{打印使用“%”}终结”

编辑请阅读评论,然后复制粘贴或使用此任何严肃的工作。这是一个没有测试和使用,它是一个想法的人谁不想安装一个实用程序或任何发行版的工作。有些人认为你可以“apt-get - install”任何东西。

注意:这不是当前的CPU使用率,而是系统启动以来所有核心的CPU使用率。这可能与当前的CPU使用情况有很大不同。要获得当前值,必须使用top(或类似的工具)。

可以通过以下方法计算当前CPU使用情况:

awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print ($2+$4-u1) * 100 / (t-t1) "%"; }' \
<(grep 'cpu ' /proc/stat) <(sleep 1;grep 'cpu ' /proc/stat)

你可以试试:

top -bn1 | grep "Cpu(s)" | \
           sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | \
           awk '{print 100 - $1"%"}'

编辑:我注意到在另一个用户的回复中%idle是字段12而不是字段11。awk已被更新,以考虑%idle字段为变量。

这应该会得到你想要的输出:

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { print 100 - $field }'

如果你想要一个简单的整数舍入,你可以使用printf:

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d%%",100 - $field) }'

不妨用我的解决方案给出一个实际的回应,我的解决方案受到了彼得·利延伯格的启发:

$ mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12"%" }'
0.75%

这将使用awk打印出100减去第12个字段(空闲),后面有一个百分比符号。Awk只对第12个字段只有数字和点的行($12 ~ /[0-9]+/)执行此操作。

你也可以平均5个样本,间隔1秒:

$ mpstat 1 5 | awk 'END{print 100-$NF"%"}'

像这样测试它:

$ mpstat 1 5 | tee /dev/tty | awk 'END{print 100-$NF"%"}'

执行此操作可以查看总体CPU使用情况。它调用python3并使用跨平台的psutil模块。

printf "%b" "import psutil\nprint('{}%'.format(psutil.cpu_percent(interval=2)))" | python3

interval=2部分表示在2秒的阻塞周期内测量总CPU负载。

样例输出:

9.4%

它包含的python程序是这样的:

import psutil

print('{}%'.format(psutil.cpu_percent(interval=2)))

在调用前放置时间证明在本例中需要大约2秒的指定间隔时间。下面是调用和输出:

$ time printf "%b" "import psutil\nprint('{}%'.format(psutil.cpu_percent(interval=2)))" | python3
9.5%

real    0m2.127s
user    0m0.119s
sys 0m0.008s

为了查看单个核的输出,让我们使用下面的python程序。首先,我获得一个包含“每个CPU”信息的python列表(数组),然后对该列表中的所有内容求平均,以获得一个“total % CPU”类型的值。然后我打印出总数和单个核心百分比。

Python程序:

import psutil

cpu_percent_cores = psutil.cpu_percent(interval=2, percpu=True)
avg = sum(cpu_percent_cores)/len(cpu_percent_cores)
cpu_percent_total_str = ('%.2f' % avg) + '%'
cpu_percent_cores_str = [('%.2f' % x) + '%' for x in cpu_percent_cores]
print('Total: {}'.format(cpu_percent_total_str))
print('Individual CPUs: {}'.format('  '.join(cpu_percent_cores_str)))

如果您愿意,可以将其打包成一个极其丑陋的一行bash脚本,就像这样。我必须确保在Python程序中只使用单引号("),而不是双引号(""),以便将此包装为bash 1-liner工作:

printf "%b" \
"\
import psutil\n\
cpu_percent_cores = psutil.cpu_percent(interval=2, percpu=True)\n\
avg = sum(cpu_percent_cores)/len(cpu_percent_cores)\n\
cpu_percent_total_str = ('%.2f' % avg) + '%'\n\
cpu_percent_cores_str = [('%.2f' % x) + '%' for x in cpu_percent_cores]\n\
print('Total: {}'.format(cpu_percent_total_str))\n\
print('Individual CPUs: {}'.format('  '.join(cpu_percent_cores_str)))\n\
" | python3

示例输出:注意我有8个核,所以在“单个cpu”后面有8个数字:

Total: 10.15%
Individual CPUs: 11.00%  8.50%  11.90%  8.50%  9.90%  7.60%  11.50%  12.30%

有关psutil.cpu_percent(interval=2) python调用如何工作的更多信息,请参阅官方的psutil.cpu_percent。cpu_percent(interval=None, percpu=False)文档如下:

psutil.cpu_percent(interval=None, percpu=False) Return a float representing the current system-wide CPU utilization as a percentage. When interval is > 0.0 compares system CPU times elapsed before and after the interval (blocking). When interval is 0.0 or None compares system CPU times elapsed since last call or module import, returning immediately. That means the first time this is called it will return a meaningless 0.0 value which you are supposed to ignore. In this case it is recommended for accuracy that this function be called with at least 0.1 seconds between calls. When percpu is True returns a list of floats representing the utilization as a percentage for each CPU. First element of the list refers to first CPU, second element to second CPU and so on. The order of the list is consistent across calls. Warning: the first time this function is called with interval = 0.0 or None it will return a meaningless 0.0 value which you are supposed to ignore.

进一步:

我在eRCaGuy_dotfiles repo的cpu_logger.py脚本中使用了上述代码。

引用:

堆栈溢出:如何在Python中获得当前的CPU和RAM使用情况? 堆栈溢出:在单行命令行中执行多行语句? 如何显示有两个小数点后的浮点数? 求列表的平均值

相关的

https://unix.stackexchange.com/questions/295599/how-to-show-processes-that-use-more-than-30-cpu/295608#295608 https://askubuntu.com/questions/22021/how-to-log-cpu-load