欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

如何在 Linux 命令行中获取 CPU 占用率

最编程 2024-02-18 17:46:30
...

0x1 概述

最近想通过 linux shell 得到 CPU 使用率
查了一些文档,也踩了一些坑
记录下来,分享给大家

0x2 top の 1

想法是通过 top 命令得到 CPU 使用率

输入top,我们看下有什么信息

image.png

0x3 top 参数、含义、思路

查了一下top的参数, -n 参数的意思是 刷新一次就停止(只输入top 是会一直在刷新的)
Cpu 这一行有很多参数
us 是用户空间占比
sy 是内核态占比
id 是空闲占比
还有其它的都是各种场景的使用占比
所以我们是取出 id, 然后 100-id

0x4 awk

0x4.1 先把 Cpu 这一行给切出来

top -n1 | fgrep "Cpu(s)" | tail -1

image.png

0x4.2 对于这一行,从 id, 这里给切开

top -n1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' '{ printf "%s", $1; }'

输出如下

[root@cf6d9e5767eb94c7e857cd35600149344-node1 ~]# top -n1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' '{ printf "%s", $1; }'
%Cpu(s):  1.6 us,  1.6 sy,  0.0 ni, 96.8

0x4.3 然后用 英文逗号再次切一下,取最后一个数字

top -n1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' '{split($1, vs, ","); v=vs[length(vs)]; printf "%s", v; }'

输出如下


image.png

这里的语法是这样的

  • split($1, vs, ",")
    $1, 切割成数组,存到变量vs里, $1 长什么样子已经在 0x4.2 里输出了
  • v=vs[length(vs)]
    这是常见的取数组最后一个元素的语法

0x4.4 把输出的两端的空格删掉

top -n1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' '{split($1, vs, ","); v=vs[length(vs)]; sub(/\s+/, "", v);sub(/\s+/, "", v); printf "%s", v; }'

image.png

0x4.5 然后就是愉快的数学运算了

top -n1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' '{split($1, vs, ","); v=vs[length(vs)]; sub(/\s+/, "", v);sub(/\s+/, "", v); printf "%s", 100-v; }'

image.png

纳尼?为何v变成了0?
搜索了一下,在运算的时候,awk里面不能被转为数字的字符串会变成数字0

接下来就是一段漫长的搜索资料和重试过程。。。

0x5 入坑、识坑、出坑

awk这里把 字符串转为数字,尝试了各种玩法,包括 substr sub,不行
设置为变量
重新用管道重定向到另外一个 awk
皆失败

最后尝试一下输出到文件


image.png

我们来看下 文件里存的到底是啥


image.png

看到 39 49m 了吗?
之前玩过一次windows控制台字体颜色,好像就是设置这些东东

再回想一下前面的输出,这个数字是粗体的,而命令是 正常字体的


image.png

所以只要让top 不输出粗体,应该就可以了
最后想起来看到有的博客,top 后面加了一个 -b ,而粗体的英文是 blob,那么这个命令是不是取消粗体的意思呢?

试一下


image.png

可以看到加了-b 之后,没有粗体了

最后

top -b -n1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' '{split($1, vs, ","); v=vs[length(vs)]; sub(/\s+/, "", v);sub(/\s+/, "", v); printf "%s\n", 100-v; }'

image.png

ext

分享一下 计算CPU和内存、ip等数据的shell脚本

#!/bin/bash

# 得到ip
ip=`ip addr show eth0 | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print ""$2 }'`
echo $ip
ip_index=`echo $ip | awk -F '.' '{print $4}'`

#计算cpu使用率
cpu=`top -b -n1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' '{split($1, vs, ","); v=vs[length(vs)]; sub(/\s+/, "", v);sub(/\s+/, "", v); printf "%d", 100-v;}'`
echo $cpu

#统计内存使用率
mem_used_persent=`free -m | awk -F '[ :]+' 'NR==2{printf "%d", ($2-$7)/$2*100}'`
echo $mem_used_persent

输出(我用了 %d ,所以最后输出的都是整数,大家可以使用 %f 自行调整)

172.18.237.171  (`eth0`的`ip`地址)
12 (`cpu`使用率)
56 (`内存`使用率)

推荐阅读