系统监控脚本,转载的,源地址不知道在哪里了,忘原谅,未测试过可用性

  1. #!/bin/bash 
  2. #System Monitoring Script 
  3. while [ 1 ] 
  4. do 
  5. #本机需开启postfix或sendmail服务。 
  6. #报警邮件地址设置 
  7. MAILFROM=monitor@zhaoyun.com 
  8. MAILTO=zhaoyun006@163.com 
  9. #设置脚本运行间隔时间。单位(秒)。 
  10. RUNTIME=1 
  11. #内存使用率监控设置,单位 (%) 
  12. MEMTHRE=90 
  13. #流量监控设置 
  14. #要监控的网卡 
  15. ETHX=eth0 
  16. #填写大于多少MB的时候发送警报,单位(MB) 
  17. INFLOWTHREMB=50 
  18. OUTFLOWTHREMB=50 
  19. #填写大于多少KB的时候发送警报,单位(KB) 
  20. INFLOWTHREKB=500 
  21. OUTFLOWTHREKB=500 
  22. #TCP连接状态数量监控设置 
  23. #填写最大连接的个数 
  24. TIME_WAIT=10 
  25. FIN_WAIT1=20 
  26. FIN_WAIT2=20 
  27. ESTABLISHED=20 
  28. SYN_RECV=10 
  29. CLOSE_WAIT=10 
  30. CLOSING=10 
  31. LAST_ACK=10 
  32. #CPU使用率监控设置 
  33. #填写cpu使用率大于多少发送报警,单位(%) 
  34. CPUTHRE=5 
  35. #硬盘使用大小设置 
  36. #填写硬盘占用率,单位(%) 
  37. ROOT=80 
  38. VAR=100 
  39. USR=100 
  40. BOOT=80 
  41. #调试模式开关。(YES/NO) 
  42. DBUG=NO 
  43. #                 监 控 脚 本 执 行 内 容       
  44. ################################################################################ 
  45. time=`date +"%Y-%m-%d %H:%M:%S"` 
  46. #内存监控部分 
  47. NULL=/dev/null 
  48. MEM=`free -m |grep Mem |awk '{print $3/$2*100}'` 
  49. MEMB=`free -m |grep Mem |awk '{print $2,$4+$6+$7}'|awk '{print $1,$1-$2}'| awk '{print $2/$1*100}'` 
  50. #echo $MEM 
  51. #echo $MEMB 
  52. MA=`expr $MEM \> $MEMTHRE ` 
  53. if [ $MA -eq 1 ] ; then 
  54. sendmail -t <<EOF 
  55. from: $MAILFROM 
  56. to:$MAILTO 
  57. subject: warning 
  58.   
  59. $time MEM内存警告,当前内存占用率为$MEM %,大于$MEMTHRE %. 
  60. EOF 
  61.     fi 
  62. MB=`expr $MEMB \> $MEMTHRE` 
  63. if [ $MB -eq 1 ] ; then 
  64. sendmail -t <<EOF 
  65. from: $MAILFROM 
  66. to:$MAILTO 
  67. subject: warning 
  68.   
  69. $time MEMB内存警告,当前内存占用率为$MEMB %,大于$MEMTHRE % 
  70. EOF 
  71.     fi 
  72.  
  73. #流量监控部分 
  74. FLOWA=/tmp/.flow 
  75. ifconfig $ETHX |grep "RX byte" |awk '{print $2"    "$6}' |awk -Fbytes: '{print "INPUT  "$2"OUTPUT  "$3}'\ > $FLOWA 
  76. INPUTA=`cat $FLOWA |awk '{print $2}'` 
  77. OUTPUTA=`cat $FLOWA |awk '{print $4}'` 
  78. sleep 1 
  79. ifconfig $ETHX |grep "RX byte" |awk '{print $2"    "$6}' |awk -Fbytes: '{print "INPUT  "$2"OUTPUT  "$3}'\ > $FLOWA 
  80. INPUTB=`cat $FLOWA |awk '{print $2}'` 
  81. OUTPUTB=`cat $FLOWA |awk '{print $4}'` 
  82. INPUTC=`echo "$INPUTB-$INPUTA" | bc` 
  83. OUTPUTC=`echo "$OUTPUTB-$OUTPUTA"| bc` 
  84. INPUTMBA=`echo "$INPUTC/1024"|bc` 
  85. OUTPUTMBA=`echo "$OUTPUTC/1024"|bc` 
  86. INMBF=/tmp/.inputMB 
  87. OUTMBF=/tmp/.outputMB 
  88. echo `echo "scale=4;$INPUTMBA/1024"|bc`MB > $INMBF 
  89. echo `echo "scale=4;$OUTPUTMBA/1024"|bc`MB > $OUTMBF 
  90. INMB=`cat $INMBF |awk '{print $1}'` 
  91. OUTMB=`cat $OUTMBF |awk '{print $1}'` 
  92.   if [ $INPUTMBA -gt 1024 ] ; then 
  93.               if [ $INMB -gt $INFLOWTHREMB ] ;then 
  94. sendmail -t <<EOF 
  95. from: $MAILFROM 
  96. to:$MAILTO 
  97. subject: warning 
  98. $time 流量警告,当前流量异常,请登录服务器查看。当前速率$INMB MB/秒,大于$INFLOWTHREMB MB/秒。 
  99. EOF 
  100.               fi 
  101.     if [ $OUTMB -gt $OUTFLOWTHREMB ] ;then 
  102. sendmail -t <<EOF 
  103. from: $MAILFROM 
  104. to:$MAILTO 
  105. subject: warning 
  106. $time 流量警告,当前流量异常,请登录服务器查看。当前速率$OUTMB MB/秒 大于$OUTFLOWTHREMB MB/秒。 
  107. EOF 
  108.     fi 
  109. else 
  110. INKBF=/tmp/.inputKB 
  111. OUTKBF=/tmp/.outputKB 
  112. echo $INPUTMBA KB > $INKBF 
  113. echo $OUTPUTMBA KB > $OUTKBF 
  114. INKB=`cat $INKBF |awk '{print $1}'` 
  115. OUTKB=`cat $OUTKBF |awk '{print $1}'` 
  116.               if [ $INKB -gt $INFLOWTHREKB ] ; then 
  117. sendmail -t <<EOF 
  118. from: $MAILFROM 
  119. to:$MAILTO 
  120. subject: warning 
  121. $time 流量警告,当前流量异常,请登录服务器查看。$INKB KB/秒 大于$INFLOWTHREKB KB/秒。 
  122. EOF 
  123.               fi 
  124.     if [ $OUTKB -gt $OUTFLOWTHREKB ] ;then 
  125. sendmail -t <<EOF 
  126. from: $MAILFROM 
  127. to:$MAILTO 
  128. subject: warning 
  129. $time 流量警告,当前流量异常,请登录服务器查看。当前速率$OUTKB KB/秒大于$INFLOWTHREKB KB/秒。 
  130. EOF 
  131.     fi 
  132. fi 
  133. #连接数 
  134. tcpfile=/tmp/.tcp 
  135. netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' >$tcpfile 
  136. grep TIME_WAIT $tcpfile > $NULL 
  137. if [ $? -eq 1 ] ; then 
  138. echo "TIME_WAIT 0 " >> $tcpfile 
  139. fi 
  140. grep FIN_WAIT1 $tcpfile > $NULL 
  141. if [ $? -eq 1 ] ; then 
  142. echo "FIN_WAIT1 0 " >> $tcpfile 
  143. fi 
  144. grep FIN_WAIT2 $tcpfile  > $NULL 
  145. if [ $? -eq 1 ] ; then 
  146. echo "FIN_WAIT2 0 " >> $tcpfile 
  147. fi 
  148. grep CLOSE_WAIT $tcpfile  > $NULL 
  149. if [ $? -eq 1 ] ; then 
  150. echo "CLOSE_WAIT 0 " >> $tcpfile 
  151. fi 
  152. grep LAST_ACK $tcpfile  > $NULL 
  153. if [ $? -eq 1 ] ; then 
  154. echo "LAST_ACK 0 " >> $tcpfile 
  155. fi 
  156. grep SYN_RECV $tcpfile  > $NULL 
  157. if [ $? -eq 1 ] ; then 
  158. echo "SYN_RECV 0 " >> $tcpfile 
  159. fi 
  160. grep CLOSING $tcpfile  > $NULL 
  161. if [ $? -eq 1 ] ; then 
  162. echo "CLOSING 0 " >> $tcpfile 
  163. fi 
  164. grep ESTABLISHED $tcpfile  > $NULL 
  165. if [ $? -eq 1 ] ; then 
  166. echo "ESTABLISHED 0 " >> $tcpfile 
  167. fi 
  168.  
  169. TIME_WAITV=`grep TIME_WAIT $tcpfile | awk '{print $2}'` 
  170. FIN_WAIT1V=`grep FIN_WAIT1 $tcpfile | awk '{print $2}'` 
  171. FIN_WAIT2V=`grep FIN_WAIT2 $tcpfile | awk '{print $2}'` 
  172. ESTABLISHEDV=`grep ESTABLISHED $tcpfile | awk '{print $2}'` 
  173. SYN_RECVV=`grep SYN_RECV $tcpfile | awk '{print $2}'` 
  174. CLOSINGV=`grep CLOSING $tcpfile | awk '{print $2}'` 
  175. CLOSE_WAITV=`grep CLOSE_WAIT $tcpfile | awk '{print $2}'` 
  176. LAST_ACKV=`grep LAST_ACK $tcpfile | awk '{print $2}'` 
  177.   if [ $ESTABLISHEDV -gt $ESTABLISHED ] ; then 
  178. sendmail -t <<EOF 
  179. from: $MAILFROM 
  180. to:$MAILTO 
  181. subject: warning 
  182. $time 连接数警告,当前ESTABLISHED连接数异常,请登录服务器查看。当前连接数为$ESTABLISHEDV个,大于$ESTABLISHED个 
  183. EOF 
  184.   fi 
  185.   if [ $SYN_RECVV -gt $SYN_RECV ] ; then 
  186. sendmail -t <<EOF 
  187. from: $MAILFROM 
  188. to:$MAILTO 
  189. subject: warning 
  190. $time 连接数警告,当前SYN_RECV连接数异常,请登录服务器查看。当前连接数为$SYN_RECVV个,大于$SYN_REC个。 
  191. EOF 
  192.   fi 
  193.  if [ $CLOSE_WAITV -gt $CLOSE_WAIT ] ; then 
  194. sendmail -t <<EOF 
  195. from: $MAILFROM 
  196. to:$MAILTO 
  197. subject: warning 
  198. $time 连接数警告,当前CLOSE_WAIT连接数异常,请登录服务器查看。当前连接数为$CLOSE_WAITV个,大于$CLOSE_WAIT个。 
  199. EOF 
  200.   fi 
  201.   if [ $CLOSINGV -gt $CLOSING ] ; then 
  202. sendmail -t <<EOF 
  203. from: $MAILFROM 
  204. to:$MAILTO 
  205. subject: warning 
  206. $time 连接数警告,当前CLOSING连接数异常,请登录服务器查看。当前连接数为$CLOSINGV个,大于$CLOSING个。 
  207. EOF 
  208.   fi 
  209.   if [ $LAST_ACKV -gt $LAST_ACK ] ; then 
  210. sendmail -t <<EOF 
  211. from: $MAILFROM 
  212. to:$MAILTO 
  213. subject: warning 
  214. $time 连接数警告,当前LAST_ACK连接数异常,请登录服务器查看。当前连接数为$LAST_ACKV个,大于$LAST_ACK个。      
  215. EOF 
  216.   fi 
  217. if [ $TIME_WAITV -gt $TIME_WAIT ] ; then 
  218. sendmail -t <<EOF 
  219. from: $MAILFROM 
  220. to:$MAILTO 
  221. subject: warning 
  222. $time 连接数警告,当前TIME_WAIT连接数异常,请登录服务器查看。当前连接数为$TIME_WAITV个,大于$TIME_WAIT个。      
  223. EOF 
  224.   fi 
  225. if [ $FIN_WAIT1V -gt $FIN_WAIT1 ] ; then 
  226. sendmail -t <<EOF 
  227. from: $MAILFROM 
  228. to:$MAILTO 
  229. subject: warning 
  230. $time 连接数警告,当前FIN_WAIT1连接数异常,请登录服务器查看。当前连接数为$FIN_WAIT1V个,大于$FIN_WAIT1个。    
  231. EOF 
  232.   fi 
  233. if [ $FIN_WAIT2V -gt $FIN_WAIT2 ] ; then 
  234. sendmail -t <<EOF 
  235. from: $MAILFROM 
  236. to:$MAILTO 
  237. subject: warning 
  238. $time 连接数警告,当前FIN_WAIT2连接数异常,请登录服务器查看。当前连接数为$FIN_WAIT2V个,大于$FIN_WAIT2个。 
  239. EOF 
  240.   fi 
  241. DISKF=/tmp/.disk 
  242. df -h > $DISKF 
  243. grep var $DISKF > $NULL 
  244. if [ $? -eq 1 ] ; then 
  245. echo "/dev/sda1 20G  1.6G   17G   0% /var" >> $DISKF 
  246. fi 
  247. grep usr $DISKF > $NULL 
  248. if [ $? -eq 1 ] ; then 
  249. echo "/dev/sda1 20G  1.6G   17G   0% /usr" >> $DISKF 
  250. fi 
  251. grep boot $DISKF > $NULL 
  252. if [ $? -eq 1 ] ; then 
  253. echo "/dev/sda1 20G  1.6G   17G   0% /boot" >> $DISKF 
  254. fi 
  255. BOOTV=`cat $DISKF | grep boot  | awk '{print $5}'|awk -F% '{print $1}'` 
  256. VARV=`cat  $DISKF  | grep var  | awk '{print $5}'|awk -F% '{print $1}'` 
  257. USRV=`cat  $DISKF  | grep usr  | awk '{print $5}'|awk -F% '{print $1}'` 
  258. grep VolGroup $DISKF > $NULL 
  259. if [ $? -eq 0 ] ;then 
  260. ROOTV=`cat $DISKF | sed -n '3p' |awk '{print $4}'|awk -F% '{print $1}'` 
  261. else 
  262. ROOTV=`cat $DISKF | sed -n '2p'|awk '{print $5}'|awk -F% '{print $1}'` 
  263. fi 
  264. if [ $ROOTV -gt $ROOT ] ; then 
  265. sendmail -t <<EOF 
  266. from: $MAILFROM 
  267. to:$MAILTO 
  268. subject: warning 
  269. $time 磁盘使用警告,您监控的 /  分区已经大于你设置的数值$ROOT %,详情登陆系统查看,目前使用率为$ROOTV %. 
  270. EOF 
  271. fi 
  272. if [ $VARV -gt $VAR ] ; then 
  273. sendmail -t <<EOF 
  274. from: $MAILFROM 
  275. to:$MAILTO 
  276. subject: warning 
  277. $time 磁盘使用警告,您监控的 /var 分区已经大于你设置的数值$VAR %,详情登陆系统查看,目前使用率为$VARV %. 
  278. EOF 
  279. fi 
  280. if [ $BOOTV -gt $BOOT ] ; then 
  281. sendmail -t <<EOF 
  282. from: $MAILFROM 
  283. to:$MAILTO 
  284. subject: warning 
  285. $time 磁盘使用警告,您监控的 /boot  分区已经大于你设置的数值 $BOOT %,详情登陆系统查看,目前使用率为$BOOTV %. 
  286. EOF 
  287. fi 
  288. if [ $USRV -gt $USR ] ; then 
  289. sendmail -t <<EOF 
  290. from: $MAILFROM 
  291. to:$MAILTO 
  292. subject: warning 
  293. $time 磁盘使用警告,您监控的 /usr  分区已经大于你设置的数值$USR %,详情登陆系统查看,目前使用率为$USRV %. 
  294. EOF 
  295. fi 
  296. #CPU 
  297. TotalA=`cat /proc/stat | sed -n '1p' | awk '{print $2+$3+$4+$5+$6+$7+$8}'` 
  298. IDLEA=`cat /proc/stat |sed -n '1p' |awk '{print $5}'` 
  299. sleep 2 
  300. TotalB=`cat /proc/stat | sed -n '1p' | awk '{print $2+$3+$4+$5+$6+$7+$8}'` 
  301. IDLEB=`cat /proc/stat |sed -n '1p' |awk '{print $5}'` 
  302. Total=`echo "$TotalB-$TotalA" |bc` 
  303. Idle=`echo "$IDLEB-$IDLEA" |bc` 
  304. USAGE=`echo "$Idle/$Total*100"|bc -l` 
  305. RATE=`echo "100-$USAGE "|bc -l` 
  306. USERATE=`echo "scale=2;$RATE/1"|bc`% 
  307. CA=`expr $USERATE \> $CPUTHRE` 
  308. if [ $CA -eq 1 ] ; then 
  309. sendmail -t <<EOF 
  310. from: $MAILFROM 
  311. to:$MAILTO 
  312. subject: warning 
  313. $time CPU使用警告,您监控的CPU使用率,已经超过您设置的限额$CPUTHRE % ,当前CPU使用率为$USERATE . 
  314. EOF 
  315. fi 
  316. CPURATE=`top -b -n 1 |grep Cpu | awk '{print $5}' |awk -F%id '{print 100-$1}'` 
  317. CB=`expr $CPURATE \> $CPUTHRE` 
  318. if [ $CB -eq 1  ] ; then 
  319. sendmail -t <<EOF 
  320. from: $MAILFROM 
  321. to:$MAILTO 
  322. subject: warning 
  323. $time CPU使用警告,您监控的CPU使用率,已经超过您设置的限额$CPUTHRE %,当前CPU使用率为$CPURATE . 
  324. EOF 
  325. fi 
  326. DBUGS=YES 
  327. if [ "$DBUGS" == "$DBUG" ] ; then 
  328. echo "           "'& 内  存 &' ;echo \ ; 
  329. echo "  "当前程序占用内存为 $MEMB % ,总占用内存为 $MEM % ; echo \ ; 
  330. echo "           "'& 流  量 &'; echo \ ; 
  331. YA=`wc -l $INMBF > /dev/null 2>&1 ; echo $?` 
  332.     if [ $YA -eq 1 ] ; then 
  333. echo 0 > $INMBF 
  334.     fi 
  335. IN=`expr $INMB \> $INFLOWTHREMB >$NULL; echo $? ` 2> $NULL 
  336.          if [ $IN -eq 1 ] ; then 
  337. echo "    "当前输入流量为 $INMB MB/秒 .;  
  338. echo "    "当前输入流量为 $INKB KB/秒 .;  
  339.           fi 
  340. YB=`wc -l $OUTMBF > /dev/null 2>&1 ; echo $?` 
  341.        if [ $YB -eq 1 ] ; then 
  342. echo 0 > $OUTMBF 
  343.         fi 
  344. OUT=`expr $OUTMB \> $OUTFLOWTHREMB >$NULL ; echo $?` 2> $NULL 
  345.     if [ $OUT -eq 1 ] ; then 
  346. echo "    "当前输出流量为 $OUTMB MB/秒。 ;   
  347. echo "    "当前输出流量为 $OUTKB KB/秒。 ; echo \ ; 
  348.     fi 
  349. echo "           "'& 连接数 &' ; echo \ ; 
  350. echo "    "当前TIME_WAIT"  " 连接数为 $TIME_WAITV 个。 
  351. echo "    "当前FIN_WAIT1"  " 连接数为 $FIN_WAIT1V 个。 
  352. echo "    "当前FIN_WAIT2"  " 连接数为 $FIN_WAIT2V 个。 
  353. echo "    "当前CLOSE_WAIT" " 连接数为 $CLOSE_WAITV 个。 
  354. echo "    "当前ESTABLISHED"" 连接数为 $ESTABLISHEDV 个。 
  355. echo "    "当前SYN_RECV"   " 连接数为 $SYN_RECVV 个。 
  356. echo "    "当前LAST_ACKV"  " 连接数为 $LAST_ACKV 个。 
  357. echo "    "当前CLOSING"    " 连接数为 $CLOSINGV 个。; echo \ ; 
  358. echo "         "'& CPU使用率 &' ; echo \ ; 
  359. echo "    "当前CPU 进程使用率为 $USERATE  . ;echo \ ; 
  360. echo "         "'& 磁盘使用率 &' ; echo \ ; 
  361. echo "    "当前"  "/"  "分区,"  "使用率为 $ROOTV %. 
  362. echo "    "当前/var 分区, 使用率为 $VARV %. 
  363. echo "    "当前/boot分区, 使用率为 $BOOTV %. 
  364. echo "    "当前/usr 分区, 使用率为 $USRV %. 
  365. exit  
  366. fi 
  367. sleep $RUNTIME 
  368. done 

 

  1. 运行方法,在后台运行。 
  2. [root@AR log]# ./monitor & 
  3. 停止方法 
  4. [root@AR log]# ps -aux |grep monitor | grep -v grep | awk '{print $2}' | xargs kill -9 

 脚本批量执行方法

curl -s http://shell.example.com/df.sh | sh  (来自小魔怪)