分享

SHELL脚本共享:系统实时监控程序(基于TOP指令优化)

 飞Pho 2011-03-08


  TOP相当于Linux下的资源管理器,我们公司有一部分重要的服务器便是通过该命令直接实时监控的。

  但是,TOP虽然十分强大,对我们监控却并不是很适合,不能很直观的立刻锁定到重点的数据。更不能利用程序自动完成一些判断了。

  因此,我花了一个晚上的时间,完成了下面的这个脚本,只要安装的TOP命令的Linux主机都可以正常使用该脚本!

  它目前还是很初级的版本,所以很简单,甚至很弱,但它也实现了以下一些功能:

  1.更亲和的人机界面,将重要的数据如CPU,负载,内存百分比等直接输出到平面上;

  2.实现了对前一秒的流量统计;

  3.更自由的用户自定义选项,可以通过变量来和直接修改脚本来调整排盘和自己的偏好;

  4.自动判断功能,当某一项数值出现异常时(依赖于你的预设值),将会现在在顶部有警告信息。

  我将会把这一脚本更加的完善,并完成另一份不依赖于TOP指令的脚本(它主要通过常用命令和/proc文件中获取)。

  大家任何有需要的可以直接粘贴过去使用,另外,有任何完善的建议的请直接向我提出来,谢谢。

  #!/bin/bash

  ####################################

  ## System information listen tool v0.2 ######

  ## powered by mcsrainbow ######

  ####################################

  while true

  do

  ###Copy the top's content to top.info###

  top -b1 -n1 >top.info

  sleep 2

  ###Check the flow###

  typeset in in_old dif_in

  typeset out out_old dif_out

  FLOW(){

  in_flow1=$(cat /proc/net/dev | grep eth0 | sed -e "s/(.*):(.*)/[1]/g" | awk ' { print $1 }')

  in_flow2=$(cat /proc/net/dev | grep eth1 | sed -e "s/(.*):(.*)/[1]/g" | awk ' { print $1 }')

  in_flow_byte=$(expr $in_flow1 + $in_flow2)

  in_flow=$(expr $in_flow_byte / 1024)

  out_flow1=$(cat /proc/net/dev | grep eth0 | sed -e "s/(.*):(.*)/[1]/g" | awk ' { print $9 }')

  out_flow2=$(cat /proc/net/dev | grep eth1 | sed -e "s/(.*):(.*)/[1]/g" | awk ' { print $9 }')

  out_flow_byte=$(expr $out_flow1 + $out_flow2)

  out_flow=$(expr $out_flow_byte / 1024)

  }

  FLOW

  in_old=$in_flow

  out_old=$out_flow

  sleep 1

  FLOW

  in=$in_flow

  out=$out_flow

  dif_in=$(expr $in - $in_old )

  dif_out=$(expr $out - $out_old )

  ###Clear the Screen###

  clear

  ###Define the safe number###

  servername=Server #The server's name which you running the scrīpts

  maxload=5 #Warning if the load average bigger than this number

  maxcpu=50 #Warning if the cpu bigger than is percent

  minmem=120 #Warning if the memory less than this number (MB)

  minswap=120 #Warning if the swap less than this number (MB)

  maxusers=3 #Warning if the user online more than 3

  maxzombie=2 #Warning if the zombie process more than 2

  ###Check the CPU###

  cpuinfo=`grep "Cpu(s)" top.info|awk '{print $2}'`

  cpuinfonumber=` echo $cpuinfo |awk -F "%" '{print $1}'|awk -F "." '{print $1}'`

  if [ ${maxcpu} -lt ${cpuinfonumber} ]

  then

  echo "!!!!WARNING:The CPU used too much!!!!"

  fi

  ###Check the Mem###

  meminfo=`grep "Mem:" top.info|awk '{print $4 "/" $2}'`

  usedmem_kb=`grep "Mem:" top.info|awk '{print $4}'|awk -F "k" '{print $1}'`

  usedmem_mb=$(expr $usedmem_kb / 1024)

  totalmem_kb=`grep "Mem:" top.info|awk '{print $2}'|awk -F "k" '{print $1}'`

  totalmem_mb=$(expr $totalmem_kb / 1024)

  freemem_mb=$(expr $totalmem_mb - $usedmem_mb)

  if [ ${freemem_mb} -lt ${minmem} ]

  then

  echo "!!!!WARNING:The Memory used too much!!!!"

  fi

  totalmem_kb_percent=$(expr $totalmem_kb / 100)

  percentmem=$(expr $usedmem_kb / $totalmem_kb_percent)

  ###Check the Swap###

  swapinfo=`grep "Swap:" top.info |awk '{print $4 "/" $2}'`

  usedswap_kb=`grep "Swap:" top.info |awk '{print $4}'|awk -F "k" '{print $1}'`

  usedswap_mb=$(expr $usedswap_kb / 1024)

  totalswap_kb=`grep "Swap:" top.info |awk '{print $2}'|awk -F "k" '{print $1}'`

  totalswap_mb=$(expr $totalswap_kb / 1024)

  freeswap_mb=$(expr $totalswap_mb - $usedswap_mb)

  if [ ${freeswap_mb} -lt ${minswap} ]

  then

  echo "!!!!WARNING:The Swap used too much!!!!"

  fi

  totalswap_kb_percent=$(expr $totalswap_kb / 100)

  percentswap=$(expr $usedswap_kb / $totalswap_kb_percent)

  ###Check the users online###

  useronl=`grep "load average:" top.info |sed 's/user.*//'|awk '{print $(NF)}'`

  if [ ${maxusers} -lt ${useronl} ]

  then

  echo "!!!!WARNING:The User online is more than 3!!!!"

  fi

  ###Check the load average###

  loadavg=`grep "load average:" top.info |sed 's/.*load average: //'|awk -F "," '{print $(NF-2)}'`

  loadavgnumber=`grep "load average:" top.info |sed 's/.*load average: //'|awk -F "," '{print $(NF-2)}'|awk -F "." '{print $1}'`

  if [ ${maxload} -lt ${loadavgnumber} ]

  then

  echo "!!!!WARNING:The Load Average is more than 5!!!!"

  fi

  ###Check the zombie###

  zombie=`grep "Tasks:" top.info |awk '{print $(NF-1)}'`

  if [ ${maxzombie} -lt ${zombie} ]

  then

  echo "!!!!WARNING:The Zombie Process is more than 2!!!!"

  fi

  ###Check the most process###

  processtitle=`grep "TIME+" top.info`

  processinfo=`sed -n 8p top.info`

  ###Show me the number just have counted###

  echo "Server CPU LOAD ZOMBIE USER IN OUT MEM SWAP "

  echo "${servername} ${cpuinfo} ${loadavg} ${zombie} ${useronl} ${dif_in}KB/s ${dif_out}KB/s ${meminfo} ${percentmem}% ${swapinfo} ${percentswap}% "

  echo "------------------------------------------------- -------------------"

  echo "${processtitle}"

  echo "${processinfo}"

  done

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约