Python检测服务端口存活状态并报警
最近发现公司的测试环境中有个Socket服务的端口总是莫名其妙Down掉,但是服务却正常运行着,看样子是僵死了。。。
虽然是测试环境,但是也不能这样放着不管,于是连夜写了一个简单的监控脚本。因为服务器是Windows的,所以要用到wmi模块。逻辑如下:
1、使用CMD命令"net start"获取系统中处于运行状态的服务,将这些服务名称生成一个列表。
2、判断监控的服务是否存在于列表中,如果不存在说明服务已经停止,那么将尝试启动服务,并发送报警邮件。
3、向本地的Socket服务端口发送一个connect,如果捕获到异常将尝试重启服务,并发送报警邮件。
4、每次执行时脚本将会循环执行以上步骤两次,间隔10秒,以确保服务状态正常。
在运行的时候发现了一个问题,Python使用wmi模块来对Windows系统进行操作的时候速度格外的慢,不知道有没有其他的代替方法,哪位如果有更好的方法可以指点一下。
更新:用Windows CMD命令"net start"代替了wmi模块获取运行中的服务名列表。
源码如下:
#!/usr/bin/env python import os
import wmi
import time
import socket
import smtplib
import logging
from email.mime.text import MIMEText def get_stop_service(designation):
"""To obtain a list of running the service name,
check whether the monitoring server is present in the list.
"""
lines = os.popen('net start').readlines()
line = [item.strip() for item in [i for i in lines]]
if designation in line:
return True
else:
logging.error('Service [%s] is down, try to restart the service. \r\n' % designation)
return False def monitor(sname):
"""Send the machine IP port 20000 socket request,
If capture the abnormal returns false.
"""
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 False
return True def restart_service(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.
"""
flag = False
try:
# From get_stop_service() to obtain the return value, the return value
if not run:
ret = os.system('sc start "%s"' % rstname)
if ret != 0:
raise Exception('[Errno %s]' % ret)
flag = True
elif not conn:
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 send_mail(to_list, sub, contents):
"""
Send alarm mail.
"""
mail_server = 'mail.stmp.com' # STMP Server
mail_user = 'YouAccount' # Mail account
mail_pass = 'Password' # password
mail_postfix = 'smtp.com' # Domain name me = 'Monitor alarm<%s@%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 two times,
each time interval to 10 seconds.
"""
retry = 2
count = 0
retval = False # Used return to the state of the socket
while count < retry:
ret = monitor(sname)
if not ret: # If socket connection is normaol, return retval
retval = ret
return retval
isDown = get_stop_service(sname)
restart_service(rstname=sname, conn=ret, run=isDown) host = socket.gethostname()
address = socket.gethostbyname(host)
mailto_list = ['mail@smtp.com', ] # Alarm contacts
send_mail(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 retval if __name__ == '__main__': logging.basicConfig(level=logging.INFO,
format='%(asctime)s %(levelname)s %(message)s',
datefmt='%Y/%m/%d %H:%M:%S',
filename='D:\\logs\\Monitor.log',
filemode='ab') name = 'Service Name'
response = main(name)
if response:
logging.info('The [%s] service connection is normal \r\n' % name)
以上代码还是有可以改进的地方,将多个服务名写到文件中,程序去读取文件中的服务依次进行检测。
Python检测服务端口存活状态并报警的更多相关文章
- [记录]Zabbix3.4配置监控Oracle12c的存活状态和表空间使用率
Zabbix3.4配置监控Oracle的存活状态和表空间使用率 1.安装zabbix3.4 agent: # rpm -ivh http://repo.zabbix.com/zabbix/3.4/rh ...
- 深入Java虚拟机--判断对象存活状态
程序计数器,虚拟机栈和本地方法栈 首先我们先来看下垃圾回收中不会管理到的内存区域,在Java虚拟机的运行时数据区我们可以看到,程序计数器,虚拟机栈,本地方法栈这三个地方是比较特别的.这个三个部分的特点 ...
- 网络基本概念备忘:MAC地址,端口,HTTP状态码
MAC地址 英文MAC Address 英文全称: Media Access Control Address 别称:硬件位址 用途:定义网络设备位置 表示:十六进制数,6 Byte 特点:产品出产后M ...
- C#获得系统打开的端口和状态
实际是通过c#编程方式调用了CMD命令行,然后调用netstat命令,然后将CMD命令的输出流转到了C#控制台程序上.也可以将结果输出到文件. using System; using System.C ...
- python MySQL-Slave从服务器状态检测脚本
#!/bin/bash mysql -e "show slave status\G" > mysql_status.txt array=($(egrep 'Slave_IO_ ...
- python监控端口脚本[jkport2.0.py]
#!/usr/bin/env python #!coding=utf-8 import os import time import sys import smtplib from email.mime ...
- 利用Python进行端口扫描
利用Python进行端口扫描 - Dahlhin - 博客园 https://www.cnblogs.com/dachenzi/p/8676104.html Python实现对一个网络段扫描及端口扫描 ...
- Python监控主机是否存活,并发报警邮件
利用python写了简单测试主机是否存活脚本,此脚本不适于线上使用,因为网络延迟.丢包现象会造成误报邮件,那么后续会更新判断三次ping不通后再发报警邮件,并启用多线程处理. #!/usr/bin/e ...
- Python 22端口发邮件
#!/usr/bin/python#-*-coding:UTF-8-*- import smtplibimport timeimport os from email.mime.text import ...
随机推荐
- iOS多线程之9.自定义NSOperation
本文主要讲如何自定义NSOperation,以及自定义NSOperation的一些注意事项,以下载图片为例. 新建一个类,继承于NSOperation. CustomOperation.h 代码 ...
- 浅谈Java的匿名类
在实际的项目中看到一个很奇怪的现象,Java可以直接new一个接口,然后在new里面粗暴的加入实现代码.就像下面这样.那么问题来了,new出来的对象没有实际的类作为载体,这不是很奇怪吗? 思考以下代码 ...
- SQL优化技术分析-2:SQL书写的影响
1.同一功能同一性能不同写法SQL的影响. 如一个SQL在A程序员写的为 Select * from zl_yhjbqk B程序员写的为 Select * from dlyx.zl_yhjbqk(带表 ...
- Java 消息摘要 散列 MD5 SHA
package xxx.common.util; import java.math.BigInteger; import java.security.MessageDigest; import jav ...
- 关于Mysql 触发器
首先,测试版本 Mysql 5.6. 然后再看触发器的语法 CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name trigge ...
- 简单配置 nginx 反向代理
# Nginx 域名反向代理配置# 安装nginx yum install nginx -y# 修改配置文件 进入配置文件目录 cd /etc/nginx/conf.d 新建配置文件以.conf结尾 ...
- 7、二种 为二个不同的子网配置DHCP服务器(中继代理服务器)
环境如下: (参考之前,保证二个子网可以互相ping通) 虚拟机vm1 192.168.170.3 VMnet8 (NAT模式) 虚拟 ...
- [转]OAuth 2.0 - Authorization Code授权方式详解
本文转自:http://www.cnblogs.com/highend/archive/2012/07/06/oautn2_authorization_code.html I:OAuth 2.0 开发 ...
- JS 阶段练习~ 仿flash的图片轮换效果
结合了所学的简单运动框架~ 做这样一个综合小实例~~ -------------------------主要问题: 1.getByClassName IE低版的兼容性 2.DOM不够严谨 … 各种 ...
- java的JSP技术
java的JSP技术 [toc] 1.JSP简介 Jsp技术是用来开发java web的页面显示的,所有MVC模型里面的视图层,所以视图层的开发 jsp不是编程语言,三个英文是java server ...