閒來無事寫段Python腳本監控下數據庫及查詢網站是否正常,有異常可以發郵件警報,每10分鐘自動檢查一次
# -*- coding: UTF-8 -*-
import requests
import sys, os, re, urllib, urlparse ,sched,time
import smtplib
import traceback
import MySQLdb
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from urllib import urlopen
#上數引入所需的相應庫
reload(sys)
sys.setdefaultencoding('gbk')
#郵件函數
def sendmail(subject,msg,toaddrs,fromaddr,smtpaddr,password):
mail_msg = MIMEMultipart()
if not isinstance(subject,unicode):
subject = unicode(subject, 'utf-8')
mail_msg['Subject'] = subject
mail_msg['From'] =fromaddr
mail_msg['To'] = ','.join(toaddrs)
mail_msg.attach(MIMEText(msg, 'html', 'utf-8'))
try:
s = smtplib.SMTP()
s.connect(smtpaddr)
s.login(fromaddr,password)
s.sendmail(fromaddr, toaddrs, mail_msg.as_string())
s.quit()
except Exception,e:
print "Error: unable to send email"
print traceback.format_exc()
def huizong():
try:
conn = MySQLdb.connect(host='MySQL數據庫IP地址', port=端口號,user='用戶名',passwd='密碼',db='數據庫')
cur=conn.cursor()
count = cur.execute('select 某一字段名 from 表名 limit 1')
results = cur.fetchall()
cur.close()
conn.close()
mysqlshuju=1 #如果能連接上,則該變量為1
except Exception as e:
mysqlshuju=0 #如果連接出現異常,則該變量為0
if mysqlshuju==0:
shuju2="數據庫無法連接"
else:
shuju2="數據庫連接正常"
f = open('url.txt', 'r')#url.txt為需要檢查的網站的網址列表,格式需類似為http://www.baidu.com
url = f.readlines()
length = len(url)
url_result_success=[]
url_result_failed=[]
num = 0#定義一個num變量並初始化為0
for i in range(0,length):
try:
response = requests.get(url[i].strip(), verify=False, allow_redirects=True, timeout=5)
if response.status_code != 200:
#由於檢測的網站沒有重定向,所以只考慮200的狀態碼,如果有重定向還需要考慮301、302等狀態碼
raise requests.RequestException(u"Status code error: {}".format(response.status_code))
except requests.RequestException as e:
url_result_failed.append(url[i])
num=1#如果無法連接到網址,將num變為1
continue
url_result_success.append(url[i])
f.close()
result_len = len(url_result_success)
failed_len = len(url_result_failed)
if mysqlshuju==0 or num==1:
fromaddr = "發送的郵箱地址" #例如[email protected]
smtpaddr = "smtp.126.com" #這個是使用126郵箱的
toaddrs = ["填寫需要發送到的那個郵箱","填寫發送的郵箱地址"]
subject = "在線監控郵件" #郵件標題
password = "XXXXXXX" #這個密碼非郵箱登錄密碼,是開啟smpt的時候設置的那個授權密碼
msg=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))#獲取下當前的時間
for i in range(0,failed_len):#做循環,把監控到無法訪問的網址都列出來
msg += url_result_failed[i].strip()
msg+="網站無法訪問"
msg+=shuju2
sendmail(subject,msg,toaddrs,fromaddr,smtpaddr,password)
print shuju2.decode('UTF-8').encode('gbk')
else:
print shuju2.decode('UTF-8').encode('gbk')
print time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
for i in range(0,result_len):
print 'URL %s' % url_result_success[i].strip()+' '' ''success'
for i in range(0,failed_len):
print 'URL %s' % url_result_failed[i].strip()+' '' ''failed'
schedule = sched.scheduler(time.time, time.sleep)
def execute_command(cmd, inc):
#os.system(cmd)
huizong()
#print '1'
schedule.enter(inc, 0, execute_command, (cmd, inc))
def main(cmd, inc=600): #這個是定時的時間,單位是秒,目前是設置10分鐘一次
schedule.enter(0, 0, execute_command, (cmd, inc))
schedule.run()
if __name__ == '__main__':
main("netstat -an", 600)
#print code
裡面的一些IP地址及賬號和密碼填寫下,就可以正常運行了
但是監控到網址無法訪問的時候只是那個點連接時候網站沒響應,有可能下一秒就又好使了,所以下次還得優化下能夠一段時間內平均下,就會好點。