Linux下用脚本写监控代理程序

Linux下用脚本写监控代理程序

吴旻

泰岩网络工作室

 

         因工作需要,我需要监控几台服务器的程序状态,SNMP(简单网络管理协议)可以用,但并不能满足我的要求,而且并不简单。我希望实时得到诸如进程的信息、CPU使用、内存使用、网络流量、网络端口、磁盘信息使用等众多参数。

         我很快写好了监控服务端和客户端程序,但对代理端程序却一时难以确定技术方案。用任何一种语言获得这些参数都需要深入了解操作系统,好在Linux下有丰富的命令程序,估计可以帮我尽快解决问题。

      一、各种数据的收集。

这个难度不太大,因为Linux下命令丰富,所以可以很快搞定。比如,我想知道当前有没有程序使用网络端口8888,用如下命令即可解决:

netstat -ant | grep :8888

或者类似我下面的,将得到的数据更具体一些:

netstat -ant | grep 192.168.10.22:8888 | awk '{print $5,$4}'

      二、格式化保存

         网络数据一般都是有固定格式,甚至包括校验值等功能。我的这个没那么复杂,但也同样要有包标识符、包消息ID、包消息体长度等值。我是这样实现的:     MonitorMsg="/xff/xff/xff/xff"                 # msg_flag = 0xFFFFFFFF    MonitorMsg=$MonitorMsg"/x01/x00/x00/x00"      # msg_id = 1

MonitorMsg=$MonitorMsg"/x44/x00/x00/x00"      # msg_len = 68 Bytes

消息体的具体内容就完全是个性化数据了,比如,我想加入当前操作系统时间:

    timeNow=`date +%H%M%S`

    MonitorMsg=$MonitorMsg$timeNow"/x00/x00" 

因为时间是HH:MM:SS,为了内存对齐,后面又补了2字节的0x00

         再下面要做的就是将这些数据保存到文件中。echo命令完成了这一工作:

    echo -ne $MonitorMsg >> /usr/montor.dat

使用参数 –ne 是因为默认情况下echo会自动加上回车,从而导致数据对不齐。

      三、将保存后的数据发送到指定服务器。

这个命令组合超级简单,利用了tailnc

tail -f /usr/montor.dat | nc 192.168.1.228 6666

192.168.1.228即监控服务器所以的地址,端口号为6666

四、一个完整的示例

这个示例由4个脚本组成。其中比较麻烦的是停止功能,因为在这里tailnc原则上是不会自己退出来的。

 

1、数据收集

DATE=`date +%Y%m%d`

 

MsgLogPath=/opt/develop/monitor_station/

MsgLogFileName=Monitor.dat

MsgLogFile=$MsgLogPath$MsgLogFileName

 

if [ -f $MsgLogFile ] ; then

        mv $MsgLogFile $MsgLogPath$DATE"_"$MsgLogFileName".bak"

fi

 

timeNow=`date +%k%M%S`

timeEnd=180000

 

while [[ $timeNow -le $timeEnd ]]

     do

#        echo $timeNow

         MonitorMsg="/xff/xff/xff/xff"                      # flag

         MonitorMsg=$MonitorMsg"/x01/x00/x00/x00"  # id

         MonitorMsg=$MonitorMsg"/x44/x00/x00/x00"  # len

 

         MonitorMsg=$MonitorMsg"/x0e/x00/x00/x00"  # station id = 14
         timeNow=`date +%H%M%S`

         MonitorMsg=$MonitorMsg$timeNow"/x00/x00"  # msg body

 

         NetStatMsg=`netstat -ant | grep 192.168.10.22:8888 | awk '{print $5,$4}'`

         MonitorMsg=$MonitorMsg$NetStatMsg

 

         msg_len=${#NetStatMsg}

         zero_len=`expr 56 - $msg_len`

 

         index=1

         while [[ $index -le $zero_len ]]

              do

                   MonitorMsg=$MonitorMsg"/x00"

                   let index=$index+1

              done

 

         echo -ne $MonitorMsg >> $MsgLogFile

 

         sleep 3

         timeNow=`date +%k%M%S`

     done

 

2、数据发送

tail -f /opt/develop/monitor_station/Monitor.dat | nc 192.168.1.228 6666

 

3、启动程序

nohup /opt/develop/monitor_station/rec_mon_to_file.sh > /opt/develop/monitor_station/rec_mon_to_file.log 2>&1 &

sleep 5

nohup /opt/develop/monitor_station/send_mon_file.sh > /opt/develop/monitor_station/send_mon_file.log 2>&1 &

 

 

4、停止程序

ps -ef | grep -w "192.168.1.228" | awk '{print $2, $9}' | grep  -w "192.168.1.228" | awk '{print $1}' | xargs kill

ps -ef | grep -w "Monitor.dat" | awk '{print $2}' | xargs kill

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值