美文网首页
Linux shell 得到 CPU 使用率

Linux shell 得到 CPU 使用率

作者: Yellowtail | 来源:发表于2019-05-31 11:19 被阅读0次

    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 (`内存`使用率)
    

    相关文章

      网友评论

          本文标题:Linux shell 得到 CPU 使用率

          本文链接:https://www.haomeiwen.com/subject/yevbtctx.html