实用监控shell脚本——附代码

先看看效果把,这样能把我测试中想要观测的项展示出来,顺便分享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}'
#重新排版

看一下最后整体的效果☺虽然不是最优的方法,但是已经很受用了

  • 2
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值