Chinaunix首页 | 论坛 | 博客
  • 博客访问: 67143
  • 博文数量: 14
  • 博客积分: 1599
  • 博客等级: 上尉
  • 技术积分: 160
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-13 09:39
文章分类
文章存档

2011年(6)

2010年(4)

2008年(4)

分类:

2008-09-26 21:40:13

面临的问题:
公司已经部署了系统监控程序,可是有一天网络出现了中断,我却没有按计划收到短信通知,why?跑到公司一看,原来是连接外网的光电转换器出了问题,网络中断,当然通过网络进行通知发送的消息无法送达了。

改进想法:
因此,需要通过在系统监控程序所在的网络之外的网络上部署一个对监控程序所在的监控网络的状态的监控程序(有点绕,不过逻辑还算比较清晰)。嗯,不错,在IDC托管的主机上来做吧。

新的解决方案的详细需求:

1.没X(5分钟看似还比较合理)分钟对该网络进行一次检测,得到一个状态(正常/不正常)
2.如果连续N(暂射为3吧)次检测的结果为不正常,则发送邮件或短信给管理员说出现了中断(之所以要选一个连续值,主要是防止偶尔的网络拥塞丢包导致的检测状态和实际状态的差异,从统计学角度来讲叫做去掉离差值大的样本)
3.如果状态持续为不正常,则不再发送邮件或短信。
4.如果连续N(暂设为3吧)次检测的结果为正常,则发送通知给管理员说已经恢复了

开工:

第一步,先画出系统逻辑图

台上一分钟,台下十年功啊,别看这个图很简单,可是花了偶不少脑细胞的,,很费脑细胞的。

为了验证一下这个逻辑是否正常,我做了一个excel表,把状态和变量全部写出来,然后手工运行,嗨,那个累啊,累啊。还容易出错,想起了偶亲爱的Script。来来来,亲爱的,帮帮忙。

自动化测试
要求给出一个文件,用0表示检测结果正常,1表示检测结果不正常,然后用上述业务逻辑进行自动处理,给出每个处理周期中的状态和通知情况。

这个简单,不到1个小时写完,呵呵可爱的script,我爱你。
   1 #!/bin/sh
2 ############################################################
3 # Auto Test Script to demostrate the sysmon program logical
4 # Author xaliyan(at)gmail.com
5 # Date 25th Sep 2008
6 ############################################################
7
8 #STAT is the file with 0/1 to simulate the status of the target network
9 STAT=stat
10 #LN LineNumber :record number of the stat file
11 LN=`wc -l $STAT | awk '{ print $1 }'`
12 #Error and OK status counter
13 ERR=0
14 OK=0
15 #LAST have 2 status "GOOD" and "BAD"
16 LAST="GOOD"
17 #The theredhold before send notification to admin
18 INTERVAL="3"
19 i=0
20
21 #Function chech() used to check the status of the stat file at certain line
22 check(){
23 CHECK_STAT=`cat $STAT | head -n $1 | tail -n 1`
24 return $CHECK_STAT
25 }
26 #Function debug() to print the status on console
27 debug(){
28 echo Time: $i, Stat: $CHECK_STAT, OK: $OK, ERR: $ERR, LAST: $LAST
29 }
30
31 #Main
32 for (( i = 1; i <= $LN ; i++ ))
33 do
34 check $i
35
36 if [ $? -eq "0" ]; then
37 ((OK=$OK+1))
38 ERR=0
39 debug
40 if [ $OK -eq $INTERVAL ]; then
41 if [ $LAST == "BAD" ]; then
42 echo "Mail System UP"
43 LAST="GOOD"
44 OK=0
45 ERR=0
46 debug
47 fi
48 fi
49
50 else
51 ((ERR=$ERR+1))
52 OK=0
53 debug
54 if [ $ERR -eq $INTERVAL ]; then
55 if [ $LAST == "GOOD" ]; then
56 echo "Mail System DOWN"
57 LAST="BAD"
58 OK=0
59 ERR=0
60 debug
61 fi
62 fi
63 fi
64 done
运行结果:
好了,写一个状态模拟文件到stat,如下
0
0
0
0
0
1
0
0
0
0
1
1
0
0
0
0
1
1
1
0
0
0
0
0
1
1
1
1
1
1
1
0
1
1
1
1
1
0
0
1
1
1
1
1
1
。。。总之把可能的几种极端状态全部写进去。
然后运行,看看结果。

[liy@man ~]$ ./check
Time: 1, Stat: 0, OK: 1, ERR: 0, LAST: GOOD
Time: 2, Stat: 0, OK: 2, ERR: 0, LAST: GOOD
Time: 3, Stat: 0, OK: 3, ERR: 0, LAST: GOOD
Time: 4, Stat: 0, OK: 4, ERR: 0, LAST: GOOD
Time: 5, Stat: 0, OK: 5, ERR: 0, LAST: GOOD
Time: 6, Stat: 1, OK: 0, ERR: 1, LAST: GOOD
Time: 7, Stat: 0, OK: 1, ERR: 0, LAST: GOOD
Time: 8, Stat: 0, OK: 2, ERR: 0, LAST: GOOD
Time: 9, Stat: 0, OK: 3, ERR: 0, LAST: GOOD
Time: 10, Stat: 0, OK: 4, ERR: 0, LAST: GOOD
Time: 11, Stat: 1, OK: 0, ERR: 1, LAST: GOOD
Time: 12, Stat: 1, OK: 0, ERR: 2, LAST: GOOD
Time: 13, Stat: 0, OK: 1, ERR: 0, LAST: GOOD
Time: 14, Stat: 0, OK: 2, ERR: 0, LAST: GOOD
Time: 15, Stat: 0, OK: 3, ERR: 0, LAST: GOOD
Time: 16, Stat: 0, OK: 4, ERR: 0, LAST: GOOD
Time: 17, Stat: 1, OK: 0, ERR: 1, LAST: GOOD
Time: 18, Stat: 1, OK: 0, ERR: 2, LAST: GOOD
Time: 19, Stat: 1, OK: 0, ERR: 3, LAST: GOOD
Mail System DOWN
Time: 19, Stat: 1, OK: 0, ERR: 0, LAST: BAD
Time: 20, Stat: 0, OK: 1, ERR: 0, LAST: BAD
Time: 21, Stat: 0, OK: 2, ERR: 0, LAST: BAD
Time: 22, Stat: 0, OK: 3, ERR: 0, LAST: BAD
Mail System UP
Time: 22, Stat: 0, OK: 0, ERR: 0, LAST: GOOD
Time: 23, Stat: 0, OK: 1, ERR: 0, LAST: GOOD
Time: 24, Stat: 0, OK: 2, ERR: 0, LAST: GOOD
Time: 25, Stat: 1, OK: 0, ERR: 1, LAST: GOOD
Time: 26, Stat: 1, OK: 0, ERR: 2, LAST: GOOD
Time: 27, Stat: 1, OK: 0, ERR: 3, LAST: GOOD
Mail System DOWN
Time: 27, Stat: 1, OK: 0, ERR: 0, LAST: BAD
Time: 28, Stat: 1, OK: 0, ERR: 1, LAST: BAD
Time: 29, Stat: 1, OK: 0, ERR: 2, LAST: BAD
Time: 30, Stat: 1, OK: 0, ERR: 3, LAST: BAD
Time: 31, Stat: 1, OK: 0, ERR: 4, LAST: BAD
Time: 32, Stat: 0, OK: 1, ERR: 0, LAST: BAD
Time: 33, Stat: 1, OK: 0, ERR: 1, LAST: BAD
Time: 34, Stat: 1, OK: 0, ERR: 2, LAST: BAD
Time: 35, Stat: 1, OK: 0, ERR: 3, LAST: BAD
Time: 36, Stat: 1, OK: 0, ERR: 4, LAST: BAD
Time: 37, Stat: 1, OK: 0, ERR: 5, LAST: BAD
Time: 38, Stat: 0, OK: 1, ERR: 0, LAST: BAD
Time: 39, Stat: 0, OK: 2, ERR: 0, LAST: BAD
Time: 40, Stat: 1, OK: 0, ERR: 1, LAST: BAD
Time: 41, Stat: 1, OK: 0, ERR: 2, LAST: BAD
Time: 42, Stat: 1, OK: 0, ERR: 3, LAST: BAD
Time: 43, Stat: 1, OK: 0, ERR: 4, LAST: BAD
Time: 44, Stat: 1, OK: 0, ERR: 5, LAST: BAD
Time: 45, Stat: 1, OK: 0, ERR: 6, LAST: BAD
Time: 46, Stat: 0, OK: 1, ERR: 0, LAST: BAD
Time: 47, Stat: 0, OK: 2, ERR: 0, LAST: BAD
Time: 48, Stat: 0, OK: 3, ERR: 0, LAST: BAD
Mail System UP
Time: 48, Stat: 0, OK: 0, ERR: 0, LAST: GOOD
Time: 49, Stat: 1, OK: 0, ERR: 1, LAST: GOOD
Time: 50, Stat: 1, OK: 0, ERR: 2, LAST: GOOD
Time: 51, Stat: 1, OK: 0, ERR: 3, LAST: GOOD
Mail System DOWN
Time: 51, Stat: 1, OK: 0, ERR: 0, LAST: BAD
Time: 52, Stat: 1, OK: 0, ERR: 1, LAST: BAD
Time: 53, Stat: 1, OK: 0, ERR: 2, LAST: BAD
Time: 54, Stat: 1, OK: 0, ERR: 3, LAST: BAD
Time: 55, Stat: 0, OK: 1, ERR: 0, LAST: BAD
Time: 56, Stat: 0, OK: 2, ERR: 0, LAST: BAD
Time: 57, Stat: 0, OK: 3, ERR: 0, LAST: BAD
Mail System UP
Time: 57, Stat: 0, OK: 0, ERR: 0, LAST: GOOD
Time: 58, Stat: 0, OK: 1, ERR: 0, LAST: GOOD
Time: 59, Stat: 0, OK: 2, ERR: 0, LAST: GOOD
Time: 60, Stat: 0, OK: 3, ERR: 0, LAST: GOOD
[liy@man ~]$

呵呵,正是我想要的结果。
下一步
好了,check程序可以用icmp也可以在目标网络开一个TCP端口,然后通过syn确认,方法多了,随便选。
Notification么,可以发email,也可以短信,随便了。
语言么,C,C++,Perl,Python,随便了。。。
阅读(1053) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~