目录
- 一、无插件记录cpu波动变化
- 二、分类分列查看
先看看效果把,这样能把我测试中想要观测的项展示出来,顺便分享2个简单的shell命令。其中涉及到一些shell语法尤其是awk
一、无插件记录cpu波动变化
最近在测试,需要对一些关键数值进行监控和比对,特别想获得系统cpu随着时间变化的曲线以及程序的cpu%值。如果是单纯获取数值来看,不是那么直观
比如 20|30|20|10|30|34|23|45| 这种就不直观,而且如果加上自己监控的值,就更加不直观了。
为了对比历史直观方便,容易查看,用图表更好一些。
而网上的很多监控工具都需要下载,而且不一定合适,我要的功能其实很简单,所以就干脆动手做了一个监控脚本,看下效果吧:
以横向柱状图的方式显示cpu的变化,不采用普通的竖向柱状图,因为缓冲区都是上下拉动的,只要拉动滚动条就能看到历史记录,很清楚能看到曲线变化。
而且竖向的好像也比较难写╮(╯▽╰)╭
打印了括号里我想要监控的数值,还加上了时间
一开始就是想到进度条的方法,然后网上搜到例子,就动手改起来。本来是采取打印spa+=’|’ 来实现进度,我觉得用循环来spa+=’|'效率低,然后改成了用printf直接输出一定数量的"|"来完成。
#!/bin/bash
VIP='nginx'
LoadMax=5000 #想要监控的值超过该值时,字体变红色
loop=0 #循环次数,文中注释了,文中采用一直循环
i=0 #总cpu的值
n=0 #打印个数
load='' #可以自己写命令 读取想要监控服务的值
while [ 1 -le 2 ] #while [ $loop -le 100 ]
do
((i=$(top -bn2 -d 0.1|grep Cpu| sed -n '2p'|awk -F '.' '{print $1}'|awk -F ':' '{print $2}')))
#load=$(ps -eo pid,pcpu,comm |grep `pidof ${VIP}`) ###debug
load=$(top -bn1 -d 0.1|grep $VIP|awk -F 'S ' '{print $2}'|sed -e 's/^[ ]*//g'|awk -F ' ' '{print $1}'|awk -F '.' '{print$1}')
#spa=''
#((n=0))
#while [ "$n" -le "$i" ]
#do
# spa+='|'
# ((n=n+2))
#done
((n=i/2))
if [ "$load" -gt "$LoadMax" ]
then
printf "[%-50s] %d%% \033[31m(%s)\033[0m %s \n" "$(eval printf '\|%0.s' {1..${n}})" "$i" "$load" "$(date +"%H:%M:%S-%m/%d")";
else
printf "[%-50s] %d%% (%s) %s \n" "$(eval printf '\|%0.s' {1..${n}})" "$i" "$load" "$(date +"%H:%M:%S-%m/%d")";
fi
sleep 1
((loop=loop+1))
#((i=i+2))
#spa+='|'
done
echo
二、分类分列查看
下面是我对top出来的数据进行分类分列显示,因为top出来的一长串太多了,我就要把他切成4大列,而且要分类,保障一轮查询的结果,能完整显示在我屏幕上。
比如出来的数据
a1
a2
b1
a3
b2
b3
a4
b4
我要整理为
a1 | b1
a2 | b2
a3 | b3
a4 | b4
网上没有类似的例子,就自己琢磨写出来,越发觉awk很强大。当然这个只针对我的数据,要用的话可能需要稍微修改下。
while : ;do top -bHp `pidof ffmpeg` -n 1|grep -E "aaa|bbb"|awk -F ' ' '{if($12~"aaa"){sa[++sn]=$1 " " $9 " " $12;}else{sb[++dn]=$1 " " $9 " " $12;}len++;}END{for(i=1;i<=len/2;i+=2){printf "%s %s %s %s\n", sa[i],sa[i+1],sb[i],sb[i+1]}}'| awk -F ' ' '{printf "%-5s \033[31m%-4s\033[0m %-15s|%-5s \033[31m%-4s\033[0m %-15s|%-5s \033[31m%-4s\033[0m %-6s|%-5s \033[31m%-4s\033[0m %-6s \n",$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12}'|tee -a LOG_$(date +%y%m%d%H).txt;date;sleep 10;done
这里是一句shell命令,有点长,我分段解释一下是什么意思:
while : ;do grep xxx|tee -a LOG_$(date +%y%m%d%H).txt;date;sleep 10;done
#无限循环,循环里面对数据插入日志文档,并且打印时间,休眠10s
下面设计awk的语法,awk -F ‘x’ ‘{BEGIN{}if(){}else{}END{}}’,大概是这样
BEGIN是获取数据之间的操作,记得是获取数据之前!!
END则是数据处理结束之后的操作。
$1就是第一个列的元素,依次类推,$0就是所有列。
还涉及到对数组的使用,都可以百度查到。
top -bHp `pidof ffmpeg` -n 1|grep -E "aaa|bbb"
#获取要筛选的数据,如aaa,bbb
|awk -F ' ' '{if($12~"aaa"){sa[++sn]=$1 " " $9 " " $12;}else{sb[++dn]=$1 " " $9 " " $12;}len++;}END{for(i=1;i<=len/2;i+=2){printf "%s %s %s %s\n", sa[i],sa[i+1],sb[i],sb[i+1]}}'
#以空格分隔,假如第12列包含aaa就给sa数组赋值(这里是将1、9、12列数据拼接),并且sn+1,否则就给sb数组赋值。在这里我$1是pid,$9是cpu的值,$12是线程名
#END后面就根据获取到的sa,sb数组进行遍历,我这里用了取巧的方法,因为我知道我这里肯定是数量对半的。
awk的打印,%-5s 就是打印字符串,定长为5,这样有利于排版,可以自己看着来调节
\033[31m%-5s\033[0m,这种在%-5s前后加的就是打印加入颜色。
| awk -F ' ' '{printf "%-5s \033[31m%-4s\033[0m %-15s|%-5s \033[31m%-4s\033[0m %-15s|%-5s \033[31m%-4s\033[0m %-6s|%-5s \033[31m%-4s\033[0m %-6s \n",$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12}'
#重新排版
看一下最后整体的效果☺虽然不是最优的方法,但是已经很受用了