Chinaunix

标题: Python 监控服务并邮件通知报警程序交流 [打印本页]

作者: stionmel    时间: 2008-09-23 19:14
标题: Python 监控服务并邮件通知报警程序交流
目的:
    通过Python 调用ftp smtp 模块进行服务监控并对服务停止停止情况和恢复情况进行邮件通知。
目前遇到的故障:
    如果登陆FTP 服务出现异常后,程序可以通过邮件完成对管理员的通知,但是在服务恢复后,程序并不能继续进行服务状况检测,仍判断服务处于故障状况。请各位仁兄帮忙看看,小弟不胜感激……
程序流程图见附件
代码

#!/usr/bin/env python
#coding=gbk
#purpos:To moitor service and need email notice,Notice the master who is the service`s monitor.
#version:1.0
#date:09/04/2008
#writerayangjing
#mail:yangjing0617@gmail.com
import thread, time
from ftplib import FTP
import smtplib
import time
import os
import sys
server= '127.0.0.1'
server1= '127.0.0.1'
username='diandian'
loginpass='yangjing'
date=time.ctime()

log="c:\py\log.txt"
mail="c:\py\mail.txt"

flag = 0

while True:
    i = 0 #服务检测是失败技术
    j = 0 # 检查用计时单位
    while j<4:
        print "test j  is %d" %j
      
        try:
               ftp=FTP(server)
               ftp.login(username,loginpass)
               ftp.quit()
               time.sleep(5)
               print "server %s ok" %time.ctime()
        except:
               i=i+1
               print "failed i = %d " %i
               time.sleep(5)
        j = j+1
   
   
        if i==4:
                print "failed "
                try:
                    ftp=FTP(server1)
                    ftp.login(username,loginpass)
                    ftp.quit()
                    print "chceking server"
                    i=0
                    flag=2
                    print "erroe checking flag is %d" %flag
                    print "erroe checking i is %d" %i
                except:
                    pass               
                if flag==0:
                    flag = 1
                    print "failed and send email "
                        
        elif i==0:
                print "success "
        elif flag== 2:
                flag = 3
                print "recure and send email "
        if flag == 1:
                smtpServer = 'mx0.qq.com'
                fromaddr = 'yangj@ibm.com'
                toaddrs = 'admin@qq.com'
                subject ='公司网络报警'
                txt='%s 无法到达公司网络 ' %date
                date=time.ctime()
                msg = """FROM: %s\nTO: %s\nSubject: %s\ndate: %s\n\n
                %s""" %(fromaddr,toaddrs,subject,date,txt)
                server = smtplib.SMTP(smtpServer)
                server.sendmail(fromaddr, toaddrs, msg)
                server.quit( )
                flag  = 2
                print "flag is %d" %flag
        elif flag== 3 :
                smtpServer = 'mx0.qq.com'
                fromaddr = 'yangj@ibm.com'
                toaddrs = 'admin@qq.com'
                subject ='公司网络恢复'
                txt='%s 已恢复网络 ' %date
                date=time.ctime()
                msg = """FROM: %s\nTO: %s\nSubject: %s\ndate: %s\n\n
                %s""" %(fromaddr,toaddrs,subject,date,txt)
                server = smtplib.SMTP(smtpServer)
                server.sendmail(fromaddr, toaddrs, msg)
                server.quit( )
                flag  = 0



[ 本帖最后由 stionmel 于 2008-9-24 14:28 编辑 ]

warmning.png (41.34 KB, 下载次数: 108)

warmning.png

作者: stionmel    时间: 2008-09-23 19:17
极度郁闷中
作者: stionmel    时间: 2008-09-24 00:01
没人研究????
作者: stionmel    时间: 2008-09-24 00:01
自己顶,希望学习PYHTON 的朋友们都能来关注一下。
作者: xiaoyu9805119    时间: 2008-09-24 09:08

感谢楼主分享。图不错。呵呵
作者: stionmel    时间: 2008-09-24 11:02
还是没人研究????
作者: stionmel    时间: 2008-09-24 12:23
每日一顶,不信没人来管!!!!!!!!!!!!
作者: broader    时间: 2008-09-24 14:13
标题: 回复 #7 stionmel 的帖子
flag0~4是封闭循环么?
有错误提示否?
作者: stionmel    时间: 2008-09-24 14:21
原帖由 broader 于 2008-9-24 14:13 发表
flag0~4是封闭循环么?
有错误提示否?

flag 0 ~4 是做邮件发送标志位
作者: moonranger    时间: 2008-09-24 14:23
个人意见:对代码进行重构,定义几个函数完成不同的功能,而不要将所有的逻辑都放到一起。
你这一个大while循环里又是i,j,又是flag的,看着眼晕,想帮你debug也不容易。

P.S. 图的确画得不错
作者: stionmel    时间: 2008-09-24 14:28
你提出的问题已经说明了
作者: moonranger    时间: 2008-09-24 14:29
下面两段代码:
                ftp=FTP(server1)
                ftp.login(username,loginpass)
                ftp.quit()
还有
                smtpServer = 'mx0.qq.com'
                fromaddr = 'yangj@ibm.com'
                toaddrs = 'admin@qq.com'
                subject ='公司网络报警'
                txt='%s 无法到达公司网络 ' %date
                date=time.ctime()
                msg = """FROM: %s\nTO: %s\nSubject: %s\ndate: %s\n\n
                %s""" %(fromaddr,toaddrs,subject,date,txt)
                server = smtplib.SMTP(smtpServer)
                server.sendmail(fromaddr, toaddrs, msg)
                server.quit( )
都重复了两次,一个是登录FTP服务器,一个是发邮件。完全可以将其抽取成单独的函数,那样程序的结构就清晰多了。
另外,变量命名也应该注意点,尽量不要使用i, j这类意义不明确的变量名。
作者: stionmel    时间: 2008-09-24 14:33
原帖由 moonranger 于 2008-9-24 14:29 发表
下面两段代码:
                ftp=FTP(server1)
                ftp.login(username,loginpass)
                ftp.quit()
还有
                smtpServer = 'mx0.qq.com'
                froma ...

出现重复的原因是因为执行的过程中,如果出现故障并恢复后,第一段try 语句不能顺利执行,故在后重新添加了
原帖由 moonranger 于 2008-9-24 14:29 发表
                ftp=FTP(server1)
                ftp.login(username,loginpass)
                ftp.quit()

只有这样,程序才回去重新检测服务并发送服务恢复邮件。
但是又引发了一个问题,那就是恢复邮件一直在不停的发送。

[ 本帖最后由 stionmel 于 2008-9-24 14:34 编辑 ]
作者: luffy.deng    时间: 2008-09-24 14:33
if i==4:
                print "failed "
                try:
                    ftp=FTP(server1)
                    ftp.login(username,loginpass)
                    ftp.quit()
                    print "chceking server"
                    i=0
                    flag=2
                    print "erroe checking flag is %d" %flag
                    print "erroe checking i is %d" %i
                except:
                    pass               
                if flag==0:
                    flag = 1
                    print "failed and send email "
这里当i==4成立  try失败,那么if flag==0成立,此时如果ftp服务回复正常那么flag依然为1。
作者: luffy.deng    时间: 2008-09-24 14:36
服务恰好在if i==4:
                print "failed "
                try:
         ...........................
之前
     if flag==0:
                    flag = 1
之后恢复正常将导致flag一直为1。
不知道对不对?
作者: stionmel    时间: 2008-09-24 14:38
原帖由 luffy.deng 于 2008-9-24 14:33 发表
if i==4:
                print "failed "
                try:
                    ftp=FTP(server1)
                    ftp.login(username,loginpass)
                    ftp.quit()
          ...

每次发送有之后我都把flag 置为 0 了啊
作者: stionmel    时间: 2008-09-24 14:42
哎,好不容易来了两位师兄……
谈论了半天又跑了……
作者: luffy.deng    时间: 2008-09-24 14:43
我说的是这种情况
if i==4:-----------成立
                print "failed "
                try:  ---------------- 此处失败接跳到except
                    ............................
                 except:
                    pass   
  ......................................服务在这里回复正常了            
                if flag==0:
                    flag = 1
                    print "failed and send email "



考虑上面的情况 会怎么样?
作者: stionmel    时间: 2008-09-24 14:47
原帖由 luffy.deng 于 2008-9-24 14:43 发表
我说的是这种情况
if i==4:-----------成立
                print "failed "
                try:  ---------------- 此处失败接跳到except
                    ............................
         ...

我们想一块去了

我正在试验中…… 请等待
作者: stionmel    时间: 2008-09-24 14:53
标题: 回复 #19 stionmel 的帖子
关于邮件发送状态标志做了一个新的定义
0 初始
1 启用故障邮件发送程序
2 故障邮件已发送
3 进入恢复发送程序
4 恢复邮件已发送


希望在眼前了……
作者: stionmel    时间: 2008-09-24 16:08
试验结果失败……
作者: stionmel    时间: 2008-09-24 19:15
我还在等待……
继续试验中……
作者: stionmel    时间: 2008-09-24 19:40
等待和精灵们一起交流……
目前服务恢复后不能检测的问题已部分经解决了……


[ 本帖最后由 stionmel 于 2008-9-25 10:58 编辑 ]
作者: luffy.deng    时间: 2008-09-24 23:12
服务恢复后不能检测 问题出在哪儿?
作者: stionmel    时间: 2008-09-25 08:14
原帖由 stionmel 于 2008-9-23 19:14 发表

while True:
    i = 0 #服务检测是失败技术
    j = 0 # 检查用计时单位
    while j<4:
        print "test j  is %d" %j
      
        try:
               ftp=FTP(server)
               ftp.login(username,loginpass)
               ftp.quit()
               time.sleep(5)
               print "server %s ok" %time.ctime().

这部分服务检测程序,在系统服务恢复后不再执行try部分……。
作者: stionmel    时间: 2008-09-25 12:20
好冷清……
作者: luffy.deng    时间: 2008-09-25 13:12
原帖由 stionmel 于 2008-9-25 08:14 发表
while True:
    i = 0 #服务检测是失败技术
    j = 0 # 检查用计时单位
    while j<4:
        print "test j  is %d" %j
      
        try:
               ftp=FTP(server)
               ftp.login(username,loginpass)
               ftp.quit()
               time.sleep(5)
               print "server %s ok" %time.ctime().
这部分服务检测程序,在系统服务恢复后不再执行try部分……。


为何服务回复后try不再执行 ?看起来只是服务恢复后flag依然为1而已。
作者: stionmel    时间: 2008-09-26 13:13
难道这个贴就沉下去了……
作者: stionmel    时间: 2008-09-27 13:01
此贴难道称为长恨贴…………
作者: diyself    时间: 2008-09-27 19:18
这个贴极具实践性。帮。。。。

希望lz解决掉问题
作者: luffy.deng    时间: 2008-09-27 19:34
原帖由 stionmel 于 2008-9-24 14:53 发表
关于邮件发送状态标志做了一个新的定义
0 初始
1 启用故障邮件发送程序
2 故障邮件已发送
3 进入恢复发送程序
4 恢复邮件已发送

这个定义还真是复杂。下面是我的想法仅供参考
def test():
    ...
flag=0
while True:
    if 0 == flag:
        if test():
            flag=0
        else:
            flag=1
    elif 1==flag:
        if test():
            mail("网络恢复")
            flag=3
        else:
            mail("网络故障")
            flag = 2
    elif 2==flag:
        if test():
            mail("网络恢复")
            flag=3
        else:
            pass
    elif 3== flag:
        if test():
            flag=0
        else:
            flag=1
作者: lastexile    时间: 2008-09-28 02:36
路过,帮楼主顶顶
作者: stionmel    时间: 2008-09-30 13:53
原帖由 luffy.deng 于 2008-9-27 19:34 发表

这个定义还真是复杂。下面是我的想法仅供参考
def test():
    ...
flag=0
while True:
    if 0 == flag:
        if test():
            flag=0
        else:
            flag=1
    elif 1== ...


我通过思考后何处和你一样的结论……
程序分为逻辑检测、逻辑判断、邮件发送部分……
目前正在研究自定义类……
作者: stionmel    时间: 2008-10-02 19:34
此贴必火,留贴观战……
作者: stionmel    时间: 2009-06-15 09:44

作者: yhmin    时间: 2009-06-16 14:26
偷偷传授你一个小技巧,注册一个139手机邮箱,开通免费邮件短信提醒。。。再把告警邮件发到这个邮箱。。。

我试过了,效果不错,用来做监控非常好。
作者: xiaoyu9805119    时间: 2009-06-16 15:57
原帖由 yhmin 于 2009-6-16 14:26 发表
偷偷传授你一个小技巧,注册一个139手机邮箱,开通免费邮件短信提醒。。。再把告警邮件发到这个邮箱。。。

我试过了,效果不错,用来做监控非常好。

恩,这个蛮好的。 记得把内容拼拼当成标题发哦。
作者: gawk    时间: 2009-06-18 14:35
呵呵,不错




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2