abstract:用Python實(shí)現(xiàn)批量測試一組url的可用性(可以包括HTTP狀態(tài)、響應(yīng)時(shí)間等)并統(tǒng)計(jì)出現(xiàn)不可用情況的次數(shù)和頻率等。類似的,這樣的腳本可以判斷某個(gè)服務(wù)的可用性,以及在眾多的服務(wù)提供者中選擇最優(yōu)的。需求以及腳本實(shí)現(xiàn)的功能如下:默認(rèn)情況下,執(zhí)行腳本會(huì)檢測一組url的可用性。如果可用,返回從腳本所在的機(jī)器到HTTP服務(wù)器所消耗的時(shí)間和內(nèi)容等信息。如果url不可用,則記錄并提示用戶,并顯示不可用發(fā)生的時(shí)間
用Python實(shí)現(xiàn)批量測試一組url的可用性(可以包括HTTP狀態(tài)、響應(yīng)時(shí)間等)并統(tǒng)計(jì)出現(xiàn)不可用情況的次數(shù)和頻率等。
類似的,這樣的腳本可以判斷某個(gè)服務(wù)的可用性,以及在眾多的服務(wù)提供者中選擇最優(yōu)的。
需求以及腳本實(shí)現(xiàn)的功能如下:
默認(rèn)情況下,執(zhí)行腳本會(huì)檢測一組url的可用性。
如果可用,返回從腳本所在的機(jī)器到HTTP服務(wù)器所消耗的時(shí)間和內(nèi)容等信息。
如果url不可用,則記錄并提示用戶,并顯示不可用發(fā)生的時(shí)間。
默認(rèn)情況下,允許最大的錯(cuò)誤次數(shù)是200,數(shù)目可以自定義,如果達(dá)到允許的最大錯(cuò)誤次數(shù),則在輸出信息的最后,根據(jù)每一個(gè)url做出錯(cuò)誤統(tǒng)計(jì)。
如果用戶手動(dòng)停止腳本,則需要在輸出信息的最后,根據(jù)每一個(gè)url做出錯(cuò)誤統(tǒng)計(jì)。
腳本中涉及的一些技巧:
使用gevent并發(fā)處理多個(gè)HTTP請求,多個(gè)請求之間無須等待響應(yīng)(gevent還有很多使用技巧,可再自行學(xué)習(xí));
使用signal模塊捕獲信號(hào),如果捕獲到則處理并退出,避免主進(jìn)程接收到KeyboardInterrupt直接退出但無法處理的問題;
注意留意腳本中關(guān)于統(tǒng)計(jì)次數(shù)方面的小技巧;
腳本運(yùn)行效果圖( 如果圖片看不清楚,請選擇“在新標(biāo)簽頁中打開圖片” )如下:
腳本如下:
#!/usr/bin/python # encoding: utf-8 # -*- coding: utf8 -*- """ Created by PyCharm. File: LinuxBashShellScriptForOps:testNoHttpResponseException,testHttpHostAvailability.py User: Guodong Create Date: 2016/10/26 Create Time: 12:09 Function: test Http Host Availability Some helpful message: For CentOS: yum -y install python-devel python-pip; pip install gevent For Ubuntu: apt-get -y install python-dev python-pip; pip install gevent For Windows: pip install gevent """ import signal import time import sys # execute some operations concurrently using python from gevent import monkey monkey.patch_all() import gevent import urllib2 hosts = ['https://webpush.wx2.qq.com/cgi-bin/mmwebwx-bin/synccheck', 'https://webpush.wx.qq.com/cgi-bin/mmwebwx-bin/synccheck', ] errorStopCounts = 200 quit_flag = False statistics = dict() def changeQuit_flag(signum, frame): del signum, frame global quit_flag quit_flag = True print "Canceled task on their own by the user." def testNoHttpResponseException(url): tryFlag = True global quit_flag errorCounts = 0 tryCounts = 0 global statistics globalStartTime = time.time() while tryFlag: if not quit_flag: tryCounts += 1 print('GET: %s' % url) try: startTime = time.time() resp = urllib2.urlopen(url) # using module 'request' will be better, request will return header info.. endTime = time.time() data = resp.read() responseTime = endTime - startTime print '%d bytes received from %s. response time is: %s' % (len(data), url, responseTime) print "data received from %s at %d try is: %s" % (url, tryCounts, data) gevent.sleep(2) except urllib2.HTTPError as e: errorCounts += 1 statistics[url] = errorCounts currentTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) print "HTTPError occurred, %s, and this is %d times(total) occurs on %s at %s." % ( e, statistics[url], url, currentTime) if errorCounts >= errorStopCounts: globalEndTime = time.time() tryFlag = False else: globalEndTime = time.time() break for url in statistics: print "Total error counts is %d on %s" % (statistics[url], url) hosts.remove(url) for url in hosts: print "Total error counts is 0 on %s" % url globalUsedTime = globalEndTime - globalStartTime print "Total time use is %s" % globalUsedTime sys.exit(0) try: # Even if the user cancelled the task, # it also can statistics the number of errors and the consumption of time for each host. signal.signal(signal.SIGINT, changeQuit_flag) gevent.joinall([gevent.spawn(testNoHttpResponseException, host) for host in hosts]) except KeyboardInterrupt: # Note: this line can NOT be reached, because signal has been captured! print "Canceled task on their own by the user." sys.exit(0)
更多關(guān)于Python實(shí)現(xiàn)批量檢測HTTP服務(wù)的狀態(tài)請關(guān)注PHP中文網(wǎng)(ipnx.cn)其他文章!