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命令行参数解析OptionParser类用法实例
Oct 09 Python
Flask入门教程实例:搭建一个静态博客
Mar 27 Python
Python编程中的文件读写及相关的文件对象方法讲解
Jan 19 Python
使用python为mysql实现restful接口
Jan 05 Python
Python迭代器Iterable判断方法解析
Mar 16 Python
在python image 中实现安装中文字体
May 16 Python
DataFrame.groupby()所见的各种用法详解
Jun 14 Python
Python私有属性私有方法应用实例解析
Sep 15 Python
python实现扫雷游戏的示例
Oct 20 Python
selenium+python实现基本自动化测试的示例代码
Jan 27 Python
详解python网络进程
Jun 15 Python
python分分钟绘制精美地图海报
Feb 15 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边学边教》(02.Apache+PHP环境配置――上篇)
2006/12/13 PHP
学习discuz php 引入文件的方法DISCUZ_ROOT
2009/06/21 PHP
WebQQ最新登陆协议的用法
2014/12/22 PHP
Javascript 异步加载详解(浏览器在javascript的加载方式)
2012/05/20 Javascript
jQuery基础框架浅入剖析
2012/12/27 Javascript
JS对话框_JS模态对话框showModalDialog用法总结
2014/01/11 Javascript
微信js-sdk界面操作接口用法示例
2016/10/12 Javascript
node使用UEditor富文本编辑器的方法实例
2017/07/11 Javascript
基于JavaScript实现无限加载瀑布流
2017/07/21 Javascript
jQuery实现锚点向下平滑滚动特效示例
2017/08/29 jQuery
vue+vue-validator 表单验证功能的实现代码
2017/11/13 Javascript
基于nodejs实现微信支付功能
2017/12/20 NodeJs
一秒学会微信小程序制作table表格
2019/02/14 Javascript
说说如何利用 Node.js 代理解决跨域问题
2019/04/22 Javascript
基于vue手写tree插件的那点事儿
2019/08/20 Javascript
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
解决vue scoped scss 无效的问题
2020/09/04 Javascript
[47:08]OG vs INfamous 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python提取内容关键词的方法
2015/03/16 Python
python文档字符串(函数使用说明)使用详解
2019/07/30 Python
使用Python实现Wake On Lan远程开机功能
2020/01/22 Python
Python使用ElementTree美化XML格式的操作
2020/03/06 Python
如何在Win10系统使用Python3连接Hive
2020/10/15 Python
TensorFlow2.0使用keras训练模型的实现
2021/02/20 Python
洛杉矶健身中心女性专用运动服饰品牌:Marika
2018/05/09 全球购物
马来西亚在线购物市场:PGMall.my
2019/10/13 全球购物
进程的查看和调度分别使用什么命令
2015/03/25 面试题
高中生的学习总结自我鉴定
2013/10/26 职场文书
户籍证明书标准模板
2014/09/10 职场文书
高等学院职业生涯规划书范文
2014/09/16 职场文书
2015年教研室工作总结范文
2015/05/23 职场文书
2016年党员承诺书范文
2016/03/24 职场文书
五年级作文之学校的四季
2019/12/05 职场文书
浅谈vue2的$refs在vue3组合式API中的替代方法
2021/04/18 Vue.js
Navicat for MySQL的使用教程详解
2021/05/27 MySQL
JPA如何使用entityManager执行SQL并指定返回类型
2021/06/15 Java/Android