Shell 脚本如何监控程序占用带宽?

运维 系统运维
众所周知,使用iftop能监控所有程序占用的网络带宽,一般情况下,手动执行iftop就可查看。但现在需要使用脚本来监控程序占用的带宽,遇到的问题真不是一点半点,现记录如下,希望能给其它运维人带来更多的帮助。

众所周知,使用iftop能监控所有程序占用的网络带宽,一般情况下,手动执行iftop就可查看。但现在需要使用脚本来监控程序占用的带宽,遇到的问题真不是一点半点,现记录如下,希望能给其它运维人带来更多的帮助。

中途所遇到的难点:


1.iftop把结果重定向到文本中,是图形格式的

重定向到文本中的内容,全部是一行,根本无法用脚本取值。最开始我使用python读取这个文件,得到所有特殊符号,找到规律,然后使用sed替换成规范的格式。终于在自己测试机上完成,能展示出正常的格式。当放到线上机器时,特殊符号变了…又变成乱糟糟的了。网上找了很久的资料,终于找到了解决方法:iftop 1.0-pre之后的版本都能输出文本格式,之前用的是iftop 0.7版本。当晚心里有种流泪的感觉,弄了一天,结果有简单现成的方法。。。

2.一个程序不仅仅只使用一个端口

 原以为程序仅仅监听一个端口进行通信,后来询问研发得知,当这个程序是服务端的时候,端口是固定的;当这个程序主动访问外面的时候,端口是随机的。所以要想监控的准确,必须找到这个程序打开的所有端口。解决方法是:用netstat所这个程序的所有端口找出来。

3.iftop输出的流量单位不一样,且没有调整一致的命令

单位不一样,里面有Mb,Kb,b单位,需要进行换算。我的解决方法是:把Mb替换成*1000,把Kb替换成空,把b直接不要过滤掉。最后用bc一算直接得结果。

wKioL1NzkHfAk4YzAAL8FIXqbyA454.jpg

4.程序发送占用带宽好算,接收带宽不好算

  根据第2步找到的几个端口,过滤出发送出去的流量一加就可以。但是接收的怎么算?见上边图中第一条流量,有"<="的则为接收流量,"<="这些行都是未知的IP与端口,怎么把它过滤出来得出结果??我的解决方法是:把"=>"行和"<="放两个临时文件中,图中有"=>"的行第一列都有序号,那么全部是"<="行的都和它一一对应,如:发送"=>"中的是序号12,13,15。那么"<="文件中的第12,13,15行就是对应的接收流量。。是不是理解了?

5.shell脚本代码如下

  1. #!/bin/sh  
  2. #author:yangrong  
  3. #mail:10286460@qq.com  
  4. #date:2014-05-14  
  5. file_name="test.txt"  
  6. temp_file1="liuliang.txt"  
  7. temp_file2="liuliang2.txt"  
  8. iftop  -Pp -Nn -t -L 100 -s 1 >$temp_file1  
  9. pragrom_list=(VueDaemon VueCenter VueAgent VueCache VueSERVER VUEConnector Myswitch Slirpvde)  
  10. #pragrom_list=(VueSERVER VueCenter)  
  11. >$file_name  
  12. for i in ${pragrom_list[@]}  
  13. do  
  14.         port_list=`netstat -plnt|grep $i|awk '{print $4}'|awk -F: '{print $2}'`  
  15.         port_all=""  
  16.         for port in $port_list  
  17.         do  
  18.                 port_all="${port}|${port_all}"  
  19.                 port_all=`echo $port_all|sed 's/\(.*\)|$/\1/g'`  
  20.         done  
  21.         if [[ $port_all == "" ]];then  
  22.                 echo "${i}sendflow=0>> $file_name  
  23.                 echo "${i}receiveflow=0>> $file_name  
  24.                 continue  
  25.         fi  
  26.         send_flow=`cat $temp_file1 |grep -E "${port_all}"|grep -E 'Mb|Kb'|grep '=>'|awk '{print $4}'|\  
  27.         tr '\n' '+' |sed -e s/Mb/*1000/g |sed s/Kb//g |sed  's/\(.*\)+$/\1\n/g'|bc`  
  28.         #echo "cat liuliang.txt |grep -E "${port_all}"|grep -E 'Mb|Kb'|grep '=>'|awk '{print $4}'|\  
  29.         #tr '\n' '+' |sed -e s/Mb/*1000/g |sed s/Kb//g |sed  's/\(.*\)+$/\1\n/g'|bc"  
  30.         if [[ ${send_flow} == "" ]];then  
  31.                 send_flow=0  
  32.         fi  
  33.         send_num=`cat $temp_file1 |grep -E "${port_all}"|grep "=>"|awk '{print $1}'`  
  34.         echo "" > $temp_file2  
  35.         for num in $send_num  
  36.         do  
  37.           cat $temp_file1 |grep  '<='|sed -n ${num}p|grep -E 'Mb|Kb' >>$temp_file2  
  38.         done  
  39.         receive_flow=`cat $temp_file2 |grep -E 'Mb|Kb'|awk '{print $4}'|\  
  40.         tr '\n' '+' |sed -e s/Mb/*1000/g |sed s/Kb//g |sed  's/\(.*\)+$/\1\n/g'|bc`  
  41.         if [[ $receive_flow == "" ]];then  
  42.                 receive_flow=0  
  43.         fi  
  44.         echo "${i}sendflow=${send_flow}" >>$file_name  
  45.         echo "${i}receiveflow=${receive_flow}" >>$file_name  
  46. done  

6.shell脚本执行效果

脚本中定义的进程列表为:pragrom_list=(VueDaemonVueCenter VueAgent VueCache VueSERVER VUEConnector Myswitch Slirpvde)

执行脚本的输出单位是Kb。

wKioL1NzkHiDVYQtAAIVY8-h-SU791.jpg

7.附:iftop命令用法

  1. [root@center230 python]# iftop --help 
  2. iftop: unknown option -- 
  3. iftop: display bandwidth usage on aninterface by host 
  4. Synopsis: iftop -h | [-npblNBP] [-iinterface] [-f filter code] 
  5.                               [-F net/mask][-G net6/mask6] 
  6.  -h                  display thismessage #帮助信息 
  7.  -n                  don't do hostname lookups  #禁用主机解析,即不会出现IP显示域名 
  8.  -N                  don't convertport numbers to services #以数字为示端口号,如21端口不会显示成ftp 
  9.  -p                  run inpromiscuous mode (show traffic between other 
  10.                       hosts on the samenetwork segment) 
  11.  -b                  don't displaya bar graph of traffic   #以b单位显示 
  12.  -B                  Displaybandwidth in bytes    #以B单位显示 
  13.   -iinterface        listen on namedinterface   #指定监听的网口 
  14.   -ffilter code      use filter code toselect packets to count     
  15.                       (default: none, but onlyIP packets are counted) 
  16.   -Fnet/mask         show traffic flowsin/out of IPv4 network  #显示指定Ipv4段流量 
  17.   -Gnet6/mask6       show traffic flowsin/out of IPv6 network  #显示指定Ipv6段流量 
  18.  -l                  display andcount link-local IPv6 traffic (default: off) #显示Ipv6的流量 
  19.  -P                  show ports aswell as hosts  #显示端口信息 
  20.   -mlimit            sets the upper limit forthe bandwidth scale   
  21.   -cconfig file      specifies an alternativeconfiguration file 
  22.  -t                  use textinterface without ncurses #使用文本模式输出 
  23.  Sorting orders: 
  24.   -o2s                Sort by first column(2s traffic average) #按2s平均流量列排序 
  25.   -o10s               Sort by second column(10s traffic average) [default] #按10s平均流量列排序 
  26.   -o40s               Sort by third column(40s traffic average) #按50s平均流量列排序 
  27.   -osource            Sort by source address #按源IP列排序 
  28.   -odestination       Sort by destinationaddress #按目的IP列排序 
  29.  The following options are only available in combination with -t 
  30.   -snum              print one single textoutput afer num seconds, then quit #指定刷新几次。 
  31.   -Lnum              number of lines to print #显示多少行数据。当程序多流量大时,则要显示行数多些才行。 
  32. iftop, version 1.0pre4  #版本信息。 

文本输出方法:

  1. iftop -Pp -Nn -t -L 100 -s 1 >temp_file 

直接查看输iftop 即可。

iftop详细用法见网上文档。

http://www.vpser.net/manage/iftop.html

总结:

1、先尽可能的寻找已有方法。

2、基本功要杂实,对sed,awk,grep等命令要熟练使用。

3、思路要灵活多变,不能被一种方法束缚死。

责任编辑:黄丹 来源: 51TCO博客
相关推荐

2014-04-28 09:11:31

应用带宽WLAN建设

2014-05-04 09:37:51

2015-05-29 09:44:03

Trickle应用程序

2022-05-02 18:29:35

bashshellLinux

2013-09-04 09:59:49

监控 Shell 脚本

2013-08-30 10:25:22

Shell主机监控

2021-07-02 06:54:44

Shell脚本 Linux

2014-08-13 14:48:01

LinuxShell脚本

2020-11-02 08:23:36

shell脚本Linux

2020-12-02 13:19:47

Shell监控文件Linux

2023-05-20 17:45:25

LinuxShell

2021-08-09 11:36:53

Linux网络带宽命令

2020-04-01 15:11:36

Shell命令Linux

2020-09-23 06:00:04

ShellLinux邮件监控

2009-07-20 15:42:34

监控JRubyJProfiler

2019-05-24 08:19:59

2024-11-27 09:19:25

2021-04-21 08:03:34

脚本Shell读取

2021-08-20 10:46:25

Shell脚本文件Linux

2018-02-24 14:27:09

Linux命令网络带宽
点赞
收藏

51CTO技术栈公众号