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列表生成器的循环技巧分享
Mar 06 Python
Python匹配中文的正则表达式
May 11 Python
python向已存在的excel中新增表,不覆盖原数据的实例
May 02 Python
python二维列表一维列表的互相转换实例
Jul 02 Python
tensorflow 恢复指定层与不同层指定不同学习率的方法
Jul 26 Python
python实现微信每日一句自动发送给喜欢的人
Apr 29 Python
python读取Kafka实例
Dec 23 Python
python 实现简易的记事本
Nov 30 Python
五分钟学会怎么用Pygame做一个简单的贪吃蛇
Jan 06 Python
Python爬虫爬取全球疫情数据并存储到mysql数据库的步骤
Mar 29 Python
编写python程序的90条建议
Apr 14 Python
Python3 多线程(连接池)操作MySQL插入数据
Jun 09 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获取json数据所有的节点路径
2015/05/17 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
2017/03/12 PHP
Nigma vs Liquid BO3 第一场2.14
2021/03/10 DOTA
谷歌浏览器 insertCell与appendChild的区别
2009/02/12 Javascript
JS的replace方法介绍
2012/10/20 Javascript
jQuery基础知识小结
2014/12/22 Javascript
jQuery+easyui中的combobox实现下拉框特效
2015/02/27 Javascript
JQuery显示隐藏DIV的方法及代码实例
2015/04/16 Javascript
JavaScript中数据结构与算法(三):链表
2015/06/19 Javascript
javascript实现状态栏中文字动态显示的方法
2015/10/20 Javascript
JavaScript Split()方法
2015/12/18 Javascript
jQuery中通过ajax调用webservice传递数组参数的问题实例详解
2016/05/20 Javascript
由简入繁实现Jquery树状结构的方法(推荐)
2016/06/10 Javascript
Angular 中 select指令用法详解
2016/09/29 Javascript
vue loadmore组件上拉加载更多功能示例代码
2017/07/19 Javascript
vue使用axios跨域请求数据问题详解
2017/10/18 Javascript
详解vue2.0+axios+mock+axios-mock+adapter实现登陆
2018/07/19 Javascript
详解vue-property-decorator使用手册
2019/07/29 Javascript
Vue利用Blob下载原生二进制数组文件
2019/09/25 Javascript
node.js中Buffer缓冲器的原理与使用方法分析
2019/11/23 Javascript
JS写滑稽笑脸运动效果
2020/05/28 Javascript
ES2020系列之空值合并运算符 '??'
2020/07/22 Javascript
vue 动态给每个页面添加title、关键词和描述的方法
2020/08/28 Javascript
[03:02]辉夜杯主赛事第二日 每日之星
2015/12/27 DOTA
python实现单线程多任务非阻塞TCP服务端
2017/06/13 Python
基于python代码实现简易滤除数字的方法
2018/07/17 Python
python字符串替换第一个字符串的方法
2019/06/26 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
2020/01/05 Python
共产党员岗位承诺书
2014/05/29 职场文书
客服专员岗位职责
2015/02/10 职场文书
家长意见书
2015/06/04 职场文书
出生证明范本
2015/06/15 职场文书
环保证明
2015/06/23 职场文书
追悼会家属答谢词
2015/09/29 职场文书
使用Python拟合函数曲线
2022/04/14 Python
2022微信温控新功能上线
2022/05/09 数码科技