python实现批量监控网站


Posted in Python onSeptember 09, 2016

最近又新上了一部分站点,随着站点的增多,管理复杂性也上来了,俗话说:人多了不好带,我发现站点多了也不好管,因为这些站点里有重要的也有不重要的,重要核心的站点当然就管理的多一些,像一些万年都不出一次问题的,慢慢就被自己都淡忘了,冷不丁那天出个问题,还的手忙脚乱的去紧急处理,所以规范的去管理这些站点是很有必要的,今天我们就做第一步,不管大站小站,先统一把监控做起来,先不说业务情况,最起码那个站点不能访问了,要第一时间报出来,别等着业务方给你反馈,就显得我们不够专业了,那接下来我们看看如果用python实现多网站的可用性监控,脚本如下:

#!/usr/bin/env python
 
 
import pickle, os, sys, logging
from httplib import HTTPConnection, socket
from smtplib import SMTP
 
def email_alert(message, status):
  fromaddr = 'xxx@163.com'
  toaddrs = 'xxxx@qq.com'
  
  server = SMTP('smtp.163.com:25')
  server.starttls()
  server.login('xxxxx', 'xxxx')
  server.sendmail(fromaddr, toaddrs, 'Subject: %s\r\n%s' % (status, message))
  server.quit()
 
def get_site_status(url):
  response = get_response(url)
  try:
    if getattr(response, 'status') == 200:
      return 'up'
  except AttributeError:
    pass
  return 'down'
    
def get_response(url):
  try:
    conn = HTTPConnection(url)
    conn.request('HEAD', '/')
    return conn.getresponse()
  except socket.error:
    return None
  except:
    logging.error('Bad URL:', url)
    exit(1)
    
def get_headers(url):
  response = get_response(url)
  try:
    return getattr(response, 'getheaders')()
  except AttributeError:
    return 'Headers unavailable'
 
def compare_site_status(prev_results):
  
  def is_status_changed(url):
    status = get_site_status(url)
    friendly_status = '%s is %s' % (url, status)
    print friendly_status
    if urlin prev_resultsand prev_results[url] != status:
      logging.warning(status)
      email_alert(str(get_headers(url)), friendly_status)
    prev_results[url] = status
 
  return is_status_changed
 
def is_internet_reachable():
  if get_site_status('www.baidu.com') == 'down' and get_site_status('www.sohu.com') == 'down':
    return False
  return True
  
def load_old_results(file_path):
  pickledata = {}
  if os.path.isfile(file_path):
    picklefile = open(file_path, 'rb')
    pickledata = pickle.load(picklefile)
    picklefile.close()
  return pickledata
  
def store_results(file_path, data):
  output = open(file_path, 'wb')
  pickle.dump(data, output)
  output.close()
  
def main(urls):
  logging.basicConfig(level=logging.WARNING, filename='checksites.log', 
      format='%(asctime)s %(levelname)s: %(message)s', 
      datefmt='%Y-%m-%d %H:%M:%S')
  
  pickle_file = 'data.pkl'
  pickledata = load_old_results(pickle_file)
  print pickledata
    
  if is_internet_reachable():
    status_checker = compare_site_status(pickledata)
    map(status_checker, urls)
  else:
    logging.error('Either the world ended or we are not connected to the net.')
    
  store_results(pickle_file, pickledata)
 
if __name__ == '__main__':
  main(sys.argv[1:])

脚本核心点解释:

1、getattr()是python的内置函数,接收一个对象,可以根据对象属性返回对象的值。

2、compare_site_status()函数是返回的是一个内部定义的函数。

3、map(),需要2个参数,一个是函数,一个是序列,功能就是将序列中的每个元素应用函数方法。

Python 相关文章推荐
用Python编写web API的教程
Apr 30 Python
wxPython定时器wx.Timer简单应用实例
Jun 03 Python
使用Python的Twisted框架构建非阻塞下载程序的实例教程
May 25 Python
Python使用pickle模块存储数据报错解决示例代码
Jan 26 Python
Python绘制并保存指定大小图像的方法
Jan 10 Python
Python3爬楼梯算法示例
Mar 04 Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
Jun 08 Python
Python Multiprocessing多进程 使用tqdm显示进度条的实现
Aug 13 Python
Pytorch Tensor基本数学运算详解
Dec 30 Python
python读取与处理netcdf数据方式
Feb 14 Python
解决python虚拟环境切换无效的问题
Apr 30 Python
python 对象真假值的实例(哪些视为False)
Dec 11 Python
利用python批量检查网站的可用性
Sep 09 #Python
Python如何判断数独是否合法
Sep 08 #Python
python框架django基础指南
Sep 08 #Python
python中星号变量的几种特殊用法
Sep 07 #Python
Python 实现 贪吃蛇大作战 代码分享
Sep 07 #Python
python 转换 Javascript %u 字符串为python unicode的代码
Sep 06 #Python
Python 编码处理-str与Unicode的区别
Sep 06 #Python
You might like
PHP图片验证码制作实现分享(全)
2012/05/10 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
2019/08/27 PHP
javascript里模拟sleep(两种实现方式)
2013/01/25 Javascript
jquery实现图片等比例缩放以及max-width在ie中不兼容解决
2013/03/21 Javascript
JavaScript开发人员的10个关键习惯小结
2014/12/05 Javascript
jQuery实现将div中滚动条滚动到指定位置的方法
2016/08/10 Javascript
vue弹窗消息组件的使用方法
2020/09/24 Javascript
JS异步宏队列微队列原理详解
2020/09/09 Javascript
[56:20]LGD vs VP Supermajor 败者组决赛 BO3 第三场 6.10
2018/07/04 DOTA
使用cx_freeze把python打包exe示例
2014/01/24 Python
python显示天气预报
2014/03/02 Python
python里对list中的整数求平均并排序
2014/09/12 Python
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
2017/04/11 Python
解决Mac下首次安装pycharm无project interpreter的问题
2018/10/29 Python
python Tkinter版学生管理系统
2019/02/20 Python
Pyqt QImage 与 np array 转换方法
2019/06/27 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
2019/07/04 Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
2020/01/10 Python
tensorflow 初始化未初始化的变量实例
2020/02/06 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
2020/03/23 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
2020/04/25 Python
分享PyCharm最新激活码(真永久激活方法)不用每月找安装参数或最新激活码了
2020/12/27 Python
什么是跨站脚本攻击
2014/12/11 面试题
final, finally, finalize的区别
2012/03/01 面试题
史上最全面的Java面试题汇总!
2015/02/03 面试题
前台文员岗位职责
2013/12/28 职场文书
大学生职业生涯规划范文
2013/12/31 职场文书
教育英语专业毕业生的求职信
2014/03/13 职场文书
开工仪式策划方案
2014/05/23 职场文书
乡镇爱国卫生月活动总结
2014/06/25 职场文书
教师工作失职检讨书
2014/09/18 职场文书
党的群众路线教育实践活动个人批评与自我批评
2014/10/16 职场文书
三年级上册科学教学计划
2015/01/21 职场文书
事业单位财务人员岗位职责
2015/04/14 职场文书
创业计划书之家教托管
2019/09/25 职场文书
Mysql中 unique列插入重复值该怎么解决呢
2021/05/26 MySQL