例如,我想知道如何使用bash获取系统CPU使用情况并以百分比表示。
样例输出:
57%
如果有多个核心,如果能计算出平均百分比就好了。
尝试sysstat包中的mpstat
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
然后是一些__abc0或__abc1来解析你需要的信息:
mpstat | grep -A 5 "%idle" | tail -n 1 | awk -F " " '{print 100 - $ 12}'a
看看cat /proc/stat
cat /proc/stat
grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}'
编辑请在复制粘贴此或将此用于任何严肃的工作之前阅读注释。这是一个没有测试和使用,它是一个想法的人谁不想安装一个实用程序或任何发行版的工作。有些人认为你可以“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]+/)。
awk
$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模块。
python3
psutil
printf "%b" "import psutil\nprint('{}%'.format(psutil.cpu_percent(interval=2)))" | python3
interval=2部分表示在2秒的阻塞周期内测量总CPU负载。
interval=2
9.4%
它包含的python程序是这样的:
import psutil print('{}%'.format(psutil.cpu_percent(interval=2)))
在调用前放置time证明在这种情况下它需要大约2秒的指定间隔时间。下面是调用和输出:
time
$ 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程序。首先,我获得一个python列表(数组),每个cpu;信息,然后我平均该列表中的所有内容,以得到一个“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(interval=None, percpu=False)文档:
psutil.cpu_percent(interval=2)
psutil.cpu_percent(interval=None, percpu=False)
psutil.cpu_percent(interval=None, percpu=False) 返回一个浮点数,表示当前系统范围内CPU使用率的百分比。当区间为>0.0比较间隔(阻塞)前后的系统CPU时间。当interval为0.0或None时,比较自上次调用或模块导入以来的系统CPU时间,立即返回。这意味着第一次调用它时,它将返回一个毫无意义的0.0值,您应该忽略这个值。在这种情况下,为了准确起见,建议在两次调用之间至少使用0.1秒来调用此函数。当percpu为True时,返回一个浮点数列表,表示每个CPU的利用率百分比。列表的第一个元素指向第一个CPU,第二个元素指向第二个CPU,依此类推。列表的顺序在不同的调用中是一致的。 警告:第一次使用interval = 0.0或None调用此函数时,它将返回一个无意义的0.0值,您应该忽略该值。
返回一个浮点数,表示当前系统范围内CPU使用率的百分比。当区间为>0.0比较间隔(阻塞)前后的系统CPU时间。当interval为0.0或None时,比较自上次调用或模块导入以来的系统CPU时间,立即返回。这意味着第一次调用它时,它将返回一个毫无意义的0.0值,您应该忽略这个值。在这种情况下,为了准确起见,建议在两次调用之间至少使用0.1秒来调用此函数。当percpu为True时,返回一个浮点数列表,表示每个CPU的利用率百分比。列表的第一个元素指向第一个CPU,第二个元素指向第二个CPU,依此类推。列表的顺序在不同的调用中是一致的。
0.0
None
0.1
警告:第一次使用interval = 0.0或None调用此函数时,它将返回一个无意义的0.0值,您应该忽略该值。