Python监控服务端口并报警

最近发现公司的测试环境中有个Socket服务的端口总是莫名其妙Down掉,但是服务却正常运行着,看样子是僵死了。。。

虽然是测试环境,但是也不能这样放着不管,于是连夜写了一个简单的监控脚本。因为服务器是Windows的,所以要用到wmi模块。逻辑如下:

1、用wmi模块获取系统中处于停止状态的服务,生成一个字典。

2、判断监控的服务是否存在于字典中,如果存在说明服务已经停止,那么将尝试启动服务,并发送报警邮件。

3、向本地的Socket服务端口发送一个connect,如果捕获到异常将尝试重启服务,并发送报警邮件。

4、每次执行时脚本将会循环执行以上步骤三次,间隔10秒,以确保服务状态正常。

在运行的时候发现了一个问题,Python使用wmi模块来对Windows系统进行操作的时候速度格外的慢,不知道有没有其他的代替方法,哪位如果有更好的方法可以指点一下。

源码如下:

#!/usr/bin/env python

import os
import wmi
import time
import socket
import base64
import smtplib
import logging
from email.mime.text import MIMEText

def GetSrv(designation):
    """Get stopped service name and caption,
    Filtration ‘designation‘ service whether there is ‘Stopped‘.

    :return: service state
    """
    c = wmi.WMI()
    ret = dict()
    for service in c.Win32_Service():
        state, caption = service.State, service.Caption
        if state == ‘Stopped‘:
            t = ret.get(state, [])
            t.append(caption)
            ret[state] = t
    # If ‘designation‘ service in the ‘Stopped‘, return status is ‘down‘
    if designation in ret.get(‘Stopped‘):
        logging.error(‘Service [%s] is down, try to restart the service. \r\n‘ % designation)
        return ‘down‘
    return True

def Monitor(sname):
    """Send the machine IP port 20000 socket request,
    If capture the abnormal returns the string ‘ex‘.

    :return: string ‘ex‘
    """
    s = socket.socket()
    s.settimeout(3)  # timeout
    host = (‘127.0.0.1‘, 20000)
    try:  # Try connection to the host
        s.connect(host)
    except socket.error as e:
        logging.warning(‘[%s] service connection failed: %s \r\n‘ % (sname, e))
        return ‘ex‘
    return True

def RestartSocket(rstname, conn, run):
    """First check whether the service is stopped,
    if stop, start the service directly.
    The check whether the zombies,
    if a zombie, then restart the service.

    :return: flag or True
    """
    flag = False
    try:
        # From GetSrv() to obtain the return value, the return value
        if run == ‘down‘:
            ret = os.system(‘sc start "%s"‘ % rstname)
            if ret != 0:
                raise Exception(‘[Errno %s]‘ % ret)
            flag = True
        elif conn == ‘ex‘:
            retStop = os.system(‘sc stop "%s"‘ % rstname)
            retSart = os.system(‘sc start "%s"‘ % rstname)
            if retSart != 0:
                raise Exception(‘retStop [Status code %s] ‘
                                ‘retSart [Status code %s] ‘ % (retStop, retSart))
            flag = True
        else:
            logging.info(‘[%s] service running status to normal‘ % rstname)
            return True
    except Exception as e:
        logging.warning(‘[%s] service restart failed: %s \r\n‘ % (rstname, e))
        return flag

def SendMail(to_list, sub, contents):
    """Send alarm mail.

    :return: flag
    """
    mail_server = ‘mail.stmp.com‘  # STMP Server
    mail_user = ‘YouAccount‘  # Mail account
    mail_pass = base64.b64decode(‘Password‘)  # The encrypted password
    mail_postfix = ‘smtp.com‘  # Domain name

    me = ‘Monitor alarm<%[email protected]%s>‘ % (mail_user, mail_postfix)
    message = MIMEText(contents, _subtype=‘html‘, _charset=‘utf-8‘)

    message[‘Subject‘] = sub
    message[‘From‘] = me
    message[‘To‘] = ‘;‘.join(to_list)

    flag = False  # To determine whether a mail sent successfully
    try:
        s = smtplib.SMTP()
        s.connect(mail_server)
        s.login(mail_user, mail_pass)
        s.sendmail(me, to_list, message.as_string())
        s.close()
        flag = True
    except Exception, e:
        logging.warning(‘Send mail failed, exception: [%s]. \r\n‘ % e)

    return flag

def main(sname):
    """Parameter type in the name of the service need to monitor,
    perform functions defined in turn, and the return value is correct.
    After the program is running, will test three times,
    each time interval to 10 seconds.

    :return: retValue
    """
    retry = 3
    count = 0
    retValue = False  # Used return to the state of the socket
    while count < retry:
        ret = Monitor(sname)
        if ret != ‘ex‘:  # If socket connection is normaol, return retValue
            retValue = ret
            return retValue
        isDown = GetSrv(sname)
        RestartSocket(rstname=sname, conn=ret, run=isDown)

        host = socket.gethostname()
        address = socket.gethostbyname(host)
        mailto_list = [‘[email protected]‘, ]  # Alarm contacts
        SendMail(mailto_list, ‘Alarm‘,
                 ‘ <h4>Level: <u>ERROR</u></br> Host name: %s</br>‘
                 ‘ IP Address: %s</br>‘
                 ‘ Service name:</h4> <h5>%s</h5>‘
                 % (host, address, sname))
        count += 1
        time.sleep(10)
    else:
        logging.error(‘[%s] service try to restart more than three times \r\n‘ % sname)

    return retValue

if __name__ == ‘__main__‘:

    logging.basicConfig(level=logging.INFO,
                        format=‘%(asctime)s %(levelname)s %(message)s‘,
                        datefmt=‘%Y/%m/%d %H:%M:%S‘,
                        filename=‘D:\\em_logs\\SocketMonitor.log‘,
                        filemode=‘ab‘)

    name = ‘IM_IMConnectorServerWinService‘
    response = main(name)
    if response:
        logging.info(‘The [%s] service connection is normal \r\n‘ % name)
时间: 2024-10-30 13:29:32

Python监控服务端口并报警的相关文章

在服务器本地监控服务端口命令之ss

在服务器本地监控服务端口命令之ss 当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接cat /proc/net/tcp,执行速度都会很慢.可能你不会有 切身的感受,但当服务器维持的连接达到上万个的时候,使用netstat等于浪费 生命,而用ss才是节省时间.天 下武功唯快不破.ss快的秘诀在于,它利用到了TCP协议栈中tcp_diag.tcp_diag是一个用于分析统计的模块,可以获得Linux 内核中 第一手的信息,这就确保了ss的快捷高效.当然,如果你的系统中

python 监控日志并发送邮件报警

#!/usr/bin/env python #coding:utf8 import re import os import time import smtplib import socket import fcntl import struct from email.mime.text import MIMEText def get_ip_address(ifname):     s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)     r

zabbix系列(三):设置邮件报警,并测试监控80端口;

相关环境: 操作系统 描述 IP地址 server05 (centos6.6) 服务器端 192.168.10.65 server04 (centos6.6) 客户端 192.168.10.64 一.使用zabbix邮件报警功能 1.安装sendmail [[email protected]~]# service postfix stop   #linux默认使用postfix邮件服务,先关闭postfix,ss –tnl查看25端口关闭监听 [[email protected]~]#yum i

Python 监控nginx服务是否正常

Python 监控nginx服务是否正常 #!/usr/bin/env python import os, sys, time from time import strftime while True: try: ret = os.popen('ps -C nginx -o pid,cmd').readlines() if len(ret) <2: os.system("service nginx start") sys.exit(0) except Exception,ex:

用python监控您的window服务

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://world77.blog.51cto.com/414605/782935 最近比较烦,研发给的pc服务版本在虚拟机上已经开始给客户使用了,服务老是莫名的死翘翘,客户不停的电话给我,搞的我心情很差,于是在一个下午,静下心来,用python写了个简单的监控进程的脚本,当发现进程消失的时候,立即调用服务,开启服务... 脚本的工作原理是这样的:脚本读取配置文件,读取预先配置好的调用系统

Python 端口扫描 报警

#!/usr/bin/python #coding=utf8 # # import sys,os,nmap import multiprocessing import httplib,smtplib from email.MIMEText import MIMEText from email.Header import Header reload(sys) sys.setdefaultencoding('utf8') #设置收件人邮箱改成你自己的 mailto_list=['[email pro

通过SSIS监控远程服务器Windows服务并发送邮件报警!

原文:通过SSIS监控远程服务器Windows服务并发送邮件报警! 利用SSIS不仅可以做BI项目的ETL,而且还可以做一些系统监控和维护工作,由于之前供应商写的Windows服务是读取ESB的消息进行处理,且通过OA流程与访客系统进行了集成,无论是ESB出现状况,还是Windows服务出现状况,都会对访问系统造成严重影响,导致内部员工无法进行接待外部人员,因此整体对ESB进行优化,在本人博客的前一篇已介绍了<通过SSIS监控远程服务器磁盘空间并发送邮件报警!>.本文实现的方法思路与此相同,仅

Zabbix 监控服务

一.搭建Zabbix监控服务器1.部署服务运行环境(LAMP)rpm -q httpd mysql-server phprpm -q mysql php-mysqlservice httpd start ;chkconfig httpd onservice mysqld start ;chkconfig mysqld on [[email protected] ~]# vim /var/www/html/db.php<?php$db=mysql_connect("localhost&quo

Zabbix监控(十二):自动监控Linux端口

1.客户端新建脚本 [[email protected] ~]# vi /usr/local/zabbix_agent/sbin/discovertcpport.sh  #!/bin/bash portarray=(`netstat -tnlp|egrep -i "$1"|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort|uniq`) #namearray=(`netstat -tnlp|egrep -i