200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > Linux小知识---利用Snmp远程获取CPU 内存和磁盘使用率

Linux小知识---利用Snmp远程获取CPU 内存和磁盘使用率

时间:2019-09-18 13:01:23

相关推荐

Linux小知识---利用Snmp远程获取CPU 内存和磁盘使用率

知识点回顾

《网络协议学习-SNMP》

前面写了一篇Snmp协议的知识点文章,今天要利用这些知识点,再加一些shell编程知识点,实现一个利用shell脚本,远程获取某个Agent的CPU,内存和硬盘的使用率。

在网上找了半天,也没啥合适的,干脆自己写一个。

知识点补充

先把常见的OID补充一下,要不都不知道读谁

系统参数(1.3.6.1.2.1.1)

网络接口(1.3.6.1.2.1.2)

CPU及负载

内存及磁盘(1.3.6.1.2.1.25)

还有很多,也可以自定义,不过以上这些够运维使用了。

命令分析

读取用到的命令是snmpget和snmpwalk,参数就不细说了,举两个例子就可以了,按照前面的OID,来获取一下空闲的CPU

[root@localhost 41src_2in1]# snmpget -v 2c -c public 127.0.0.1 .1.3.6.1.4.1..11.11.0 UCD-SNMP-MIB::ssCpuIdle.0 = INTEGER: 95

可以看到CPU空闲95%,那么学习过数学的我们,一下子就能算出来使用率了。

获取CPU使用率

那将前面的写法封装成shell的函数即可

cpuu(){cpufree=$(snmpget -v $version -c $public $ipaddr .1.3.6.1.4.1..11.11.0 |cut -d ' ' -f4 )cpuused=$[100-cpufree]if [ $cpufree -gt 0 ];then echo $cpuused"%"else echo ""fi}

这里就涉及到了shell中的数学计算,通过$[x-y]这种写法,就可以计算一个变量的加减乘除,不过仅限于整数操作。小数的写法下面再介绍

获取内存使用率

思路很简单,先得到空闲内存数,然后得到总的内存数,然后

总内存-空闲内存/总内存

即可得到内存使用率。

这里就涉及到了小数的计算,而且这个数据,必然是小于1的,

先上函数

memu(){memfree=$(snmpget -v $version -c $public $ipaddr .1.3.6.1.4.1..4.6.0|cut -d ' ' -f4)memtotal=$(snmpget -v $version -c $public $ipaddr .1.3.6.1.4.1..4.5.0|cut -d ' ' -f4)memused=$[memtotal-memfree]memusage=$(echo "scale=2; $memused / $memtotal" | bc|cut -d '.' -f2)if [ $memusage -gt 0 ];then echo $memusage"%"else echo ""fi}

这里就用到了小数除法的计算,表达方式就是

结果=$(echo "scale=2; $A/ $B" | bc)

其实就是用了bc这个命令,系统中没有的话,需要安装

yum install bc

应该留是通过文件内容,计算结果。感兴趣的可以研究一下

获取硬盘使用率

这里怕是全网独创了一种写法,因为有时候有了一种思路,就不想再去变通了,为了实现这个思路,可谓是想尽办法。

首先这里试着读了一下总的硬盘大小,失败了

[root@localhost 41src_2in1]# snmpwalk -v 2c -c public 127.0.0.1 .1.3.6.1.4.1..9.1.6UCD-SNMP-MIB::dskTotal = No Such Instance currently exists at this OID

然后也没有成功解决这个问题,后来又发现了可以读去簇的数目和使用簇的多少

[root@localhost 41src_2in1]# snmpwalk -v 2c -c public 127.0.0.1 .1.3.6.1.2.1.25.2.3.1.6 HOST-RESOURCES-MIB::hrStorageUsed.1 = INTEGER: 24010176HOST-RESOURCES-MIB::hrStorageUsed.3 = INTEGER: 24010176HOST-RESOURCES-MIB::hrStorageUsed.6 = INTEGER: 5264HOST-RESOURCES-MIB::hrStorageUsed.7 = INTEGER: 6568376HOST-RESOURCES-MIB::hrStorageUsed.8 = INTEGER: 733540HOST-RESOURCES-MIB::hrStorageUsed.10 = INTEGER: 0HOST-RESOURCES-MIB::hrStorageUsed.35 = INTEGER: 0HOST-RESOURCES-MIB::hrStorageUsed.37 = INTEGER: 92573HOST-RESOURCES-MIB::hrStorageUsed.38 = INTEGER: 0HOST-RESOURCES-MIB::hrStorageUsed.55 = INTEGER: 7819037HOST-RESOURCES-MIB::hrStorageUsed.60 = INTEGER: 49671HOST-RESOURCES-MIB::hrStorageUsed.61 = INTEGER: 9096739HOST-RESOURCES-MIB::hrStorageUsed.65 = INTEGER: 0[root@localhost 41src_2in1]# snmpwalk -v 2c -c public 127.0.0.1 .1.3.6.1.2.1.25.2.3.1.5 HOST-RESOURCES-MIB::hrStorageSize.1 = INTEGER: 65400996HOST-RESOURCES-MIB::hrStorageSize.3 = INTEGER: 98267296HOST-RESOURCES-MIB::hrStorageSize.6 = INTEGER: 65400996HOST-RESOURCES-MIB::hrStorageSize.7 = INTEGER: 6568376HOST-RESOURCES-MIB::hrStorageSize.8 = INTEGER: 733540HOST-RESOURCES-MIB::hrStorageSize.10 = INTEGER: 32866300HOST-RESOURCES-MIB::hrStorageSize.35 = INTEGER: 8175124HOST-RESOURCES-MIB::hrStorageSize.37 = INTEGER: 8175124HOST-RESOURCES-MIB::hrStorageSize.38 = INTEGER: 8175124HOST-RESOURCES-MIB::hrStorageSize.55 = INTEGER: 18341120HOST-RESOURCES-MIB::hrStorageSize.60 = INTEGER: 257536HOST-RESOURCES-MIB::hrStorageSize.61 = INTEGER: 949451776HOST-RESOURCES-MIB::hrStorageSize.65 = INTEGER: 1635024

眼前一亮,这不就可以通过加法,计算出来使用比例了吗,我真是太聪明了

这里还用到了一种列相加的办法,例如一个文件中,有一列数字,那么就可以通过以下的shell方式计算出来

awk '{sum += $1};END {print sum}' /tmp/x.txt

然后总结了写法

snmpwalk -v $version -c $public $ipaddr .1.3.6.1.2.1.25.2.3.1.6 |cut -d ' ' -f4 > /tmp/used.txt snmpwalk -v $version -c $public $ipaddr .1.3.6.1.2.1.25.2.3.1.5 |cut -d ' ' -f4 > /tmp/all.txt hdused=$(awk '{sum += $1};END {print sum}' /tmp/used.txt) hdtotal=$(awk '{sum += $1};END {print sum}' /tmp/all.txt)hdusage=$(echo "scale=2; $hdused / $hdtotal" | bc|cut -d '.' -f2)hdusage_new=$(echo -e $hdusage | sed -r 's/0*([0-9])/\1/')if [ $hdusage_new -gt 0 ];then echo $hdusage_new"%"else echo ""fi

满怀欣喜的结算之后,发现不太对,然后就又发现,原来每个簇的大小不一样。

[root@localhost 41src_2in1]# snmpwalk -v 2c -c public 127.0.0.1 .1.3.6.1.2.1.25.2.3.1.4HOST-RESOURCES-MIB::hrStorageAllocationUnits.1 = INTEGER: 1024 BytesHOST-RESOURCES-MIB::hrStorageAllocationUnits.3 = INTEGER: 1024 BytesHOST-RESOURCES-MIB::hrStorageAllocationUnits.6 = INTEGER: 1024 BytesHOST-RESOURCES-MIB::hrStorageAllocationUnits.7 = INTEGER: 1024 BytesHOST-RESOURCES-MIB::hrStorageAllocationUnits.8 = INTEGER: 1024 BytesHOST-RESOURCES-MIB::hrStorageAllocationUnits.10 = INTEGER: 1024 BytesHOST-RESOURCES-MIB::hrStorageAllocationUnits.35 = INTEGER: 4096 BytesHOST-RESOURCES-MIB::hrStorageAllocationUnits.37 = INTEGER: 4096 BytesHOST-RESOURCES-MIB::hrStorageAllocationUnits.38 = INTEGER: 4096 BytesHOST-RESOURCES-MIB::hrStorageAllocationUnits.55 = INTEGER: 4096 BytesHOST-RESOURCES-MIB::hrStorageAllocationUnits.60 = INTEGER: 4096 BytesHOST-RESOURCES-MIB::hrStorageAllocationUnits.61 = INTEGER: 4096 BytesHOST-RESOURCES-MIB::hrStorageAllocationUnits.65 = INTEGER: 4096 Bytes

每个部分的大小需要用簇的数量*簇的大小,最终才能相加得到准确大小。

于是得到最终写法

hdu(){rm -rf /tmp/used_fin.txtrm -rf /tmp/all_fin.txtsnmpwalk -v $version -c $public $ipaddr .1.3.6.1.2.1.25.2.3.1.6 |cut -d ' ' -f4 >/tmp/used.txt snmpwalk -v $version -c $public $ipaddr .1.3.6.1.2.1.25.2.3.1.5 |cut -d ' ' -f4 >/tmp/all.txtsnmpwalk -v $version -c $public $ipaddr .1.3.6.1.2.1.25.2.3.1.4 |cut -d ' ' -f4 >/tmp/size.txtexec 3</tmp/used.txtexec 4</tmp/size.txtwhile read line1<&3 && read line2<&4doecho $[line1*line2] >> /tmp/used_fin.txtdoneexec 3</tmp/all.txtexec 4</tmp/size.txtwhile read line1<&3 && read line2<&4doecho $[line1*line2] >> /tmp/all_fin.txtdonehdused=$(awk '{sum += $1};END {print sum}' /tmp/used_fin.txt) hdtotal=$(awk '{sum += $1};END {print sum}' /tmp/all_fin.txt)echo $hdusage_new"bytes"echo $hdtotal"bytes"hdusage=$(echo "scale=2; $hdused / $hdtotal" | bc|cut -d '.' -f2)hdusage_new=$(echo -e $hdusage | sed -r 's/0*([0-9])/\1/')if [ $hdusage_new -gt 0 ];then echo $hdusage_new"%"else echo ""fi}

这里又有一个知识点,就是同时操作两个文件的每一行进行乘法。仔细阅读以下吧。

完整脚本

《下载地址》

使用例子

脚本名称 获取部分 IP地址 snmp版本 COMMUNITY

例如

分别是,硬盘,CPU和内存的使用率

[root@localhost 41src_2in1]# snmp_get.sh hdu 192.168.32.236 2c public2%[root@localhost 41src_2in1]# snmp_get.sh cpuu 192.168.32.236 2c public 2%[root@localhost 41src_2in1]# snmp_get.sh memu 192.168.32.236 2c public 36%

结束语

一个简单的需求,其实也会包含很多个小的知识点,多点耐心,各个击破,最终肯定能解决问题。

今天在群里见到一个悲伤的故事

可怜的小孩……

真正和孩子相处的方法,我觉得还是需要这样

父母与孩子,还是要共情,而不是一味的教育。

哎,这点表扬我夫人,她做的比我好多了。

我得改正一下。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。