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 稀疏矩阵-sparse 存储和转换
May 27 Python
django中的setting最佳配置小结
Nov 21 Python
Python实现模拟登录网易邮箱的方法示例
Jul 05 Python
解决tensorflow测试模型时NotFoundError错误的问题
Jul 27 Python
Django代码性能优化与Pycharm Profile使用详解
Aug 26 Python
Python传递参数的多种方式(小结)
Sep 18 Python
使用turtle绘制五角星、分形树
Oct 06 Python
8段用于数据清洗Python代码(小结)
Oct 31 Python
TensorFlow获取加载模型中的全部张量名称代码
Feb 11 Python
基于Django signals 信号作用及用法详解
Mar 28 Python
python调用API接口实现登陆短信验证
May 10 Python
Python GUI库Tkiner使用方法代码示例
Nov 27 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下使用以下代码连接并测试
2008/04/09 PHP
destoon实现资讯信息前面调用它所属分类的方法
2014/07/15 PHP
PHP图像处理类库MagickWand用法实例分析
2015/05/21 PHP
PHP对XML内容进行修改和删除实例代码
2016/10/26 PHP
php redis实现对200w用户的即时推送
2017/03/04 PHP
原生php实现excel文件读写的方法分析
2018/04/25 PHP
tp5(thinkPHP5)框架数据库Db增删改查常见操作总结
2019/01/10 PHP
使用js修改客户端注册表的方法
2013/08/09 Javascript
Mac地址验证的javascript代码
2013/11/09 Javascript
浅析jQuery(function(){})与(function(){})(jQuery)之间的区别
2014/01/09 Javascript
ztree获取当前选中节点子节点id集合的方法
2015/02/12 Javascript
解析javascript中鼠标滚轮事件
2015/05/26 Javascript
在微信、支付宝、百度钱包实现点击返回按钮关闭当前页面和窗口的方法
2016/08/05 Javascript
AngularJS实现按钮提示与点击变色效果
2016/09/07 Javascript
玩转NODE.JS(四)-搭建简单的聊天室的代码
2016/11/11 Javascript
概述如何实现一个简单的浏览器端js模块加载器
2016/12/07 Javascript
Angularjs处理页面闪烁的解决方法
2017/03/09 Javascript
微信小程序methods中定义的方法互相调用的实例代码
2018/08/07 Javascript
javascript使用链接跨域下载图片
2019/11/01 Javascript
Python提示[Errno 32]Broken pipe导致线程crash错误解决方法
2014/11/19 Python
Python open()文件处理使用介绍
2014/11/30 Python
Python中用字符串调用函数或方法示例代码
2017/08/04 Python
Python实现读取txt文件并画三维图简单代码示例
2017/12/09 Python
Python递归实现汉诺塔算法示例
2018/03/19 Python
pyqt5 实现工具栏文字图片同时显示
2019/06/13 Python
python可以用哪些数据库
2020/06/22 Python
HTML5所有标签汇总及标签意义解释
2015/03/12 HTML / CSS
联想瑞士官方网站:Lenovo Switzerland
2017/11/19 全球购物
美国销售第一的智能手机和平板电脑保护壳:OtterBox
2017/12/21 全球购物
Zavvi西班牙:电子游戏、极客服装、Blu-ray、Funko Pop等
2019/05/03 全球购物
日本乐天德国站:Rakuten.de
2019/05/16 全球购物
面试后感谢信
2014/02/01 职场文书
中学优秀班主任事迹材料
2014/05/01 职场文书
关于梦想的演讲稿
2014/05/05 职场文书
检讨书怎么写
2015/01/23 职场文书
开除通知书范本
2015/04/25 职场文书