生产环境中站点,如邮于访问量大出现异常不能正常运行,一般可以通过重启解决的。我们可以尝试通过Python监控监控web站点异常,发送邮件通知并自动重启服务。本文主要介绍Python 监控web站点异常邮件提醒并自动重启。

1、邮件发送

1)安装yagmail

pip install yagmail

2)使用代码

import yagmail
 
username = 'cjavapy@qq.com'
passwd = '**********'   # 使用的qq邮箱发送邮件,为qq邮箱的授权码,非密码,可在网页的邮箱设置中开通,其它邮箱也类似

mail = yagmail.SMTP(user=username,
                    password=passwd,
                    host='smtp.qq.com',#其他服务器就smtp.qq.com  smtp.126.com
                    smtp_ssl=True
                    ) #如果用的是qq邮箱或者你们公司的邮箱使用是安全协议的话,必须写上 smtp_ssl=True
mail.send(
    to=['to@qq.com',], #如果多个收件人的话,写成list就行了,如果只是一个账号,就直接写字符串就行to='username@qq.com'
    cc='cc@qq.com',#抄送
    subject='这是邮件主题',#邮件标题
    contents='邮件正文内容:学习Python编程!!!') #邮件正文,附件如果只有一个的话,用字符串就行

参考文档:Python 使用smtplib、zmail或yagmail发送邮件

2、web站点监控

通过请求异常和返回响应的错误代码判断站点异常,从而重新启动程序,代码如下,

import requests
import os

try:
    response = requests.get(url, headers={
    "user-agent": "aliyun_monitor_Python-urllib/cjavapy",
    "accept-encoding": "gzip"
}, data={}, timeout=50)
    if response.status_code != 200:
        NETWORK_STATUS = False
except requests.exceptions.Timeout:
    NETWORK_STATUS = False # 请求超时改变状态

    if e == requests.exceptions.Timeout and NETWORK_STATUS == False:
        '''请求超时'''
        for i in range(1, 3):
            print('请求超时,第%s次重复请求' % i)
            try:
                response = requests.get(url, headers={
                "user-agent": "aliyun_monitor_Python-urllib/cjavapy",
                "accept-encoding": "gzip"
}, data={}, timeout=50)
                if response.status_code == 200:
                    NETWORK_STATUS = True
                    continue
            except requests.exceptions.Timeout:
                NETWORK_STATUS = False
except Exception as e:
    NETWORK_STATUS = False
if NETWORK_STATUS == False:
    os.system("supervisorctl restart all")

相关文档:Linux Supervisor 进程管理工具安装及使用

3、crontab定时执行

使用Linux crontab定时执行Python程序,实现定时检测服务器状态情况,判断异常尝试重新启动并发送通知邮件。

1)配置crontab

vi /etc/crontab

编辑文件配置每5分钟执行一次,添加内容如下:

*/5 * * * * root python3 /data/checkUwsgi.py

相关文档:

cron表达式的使用及常用示例

Linux crontab 命令

2)实现代码

import requests
import os
import yagmail

def sendEmail(title,msg): 
    username = 'cjavapy@qq.com'
    passwd = '**********'   # 使用的qq邮箱发送邮件,为qq邮箱的授权码,非密码,可在网页的邮箱设置中开通,其它邮箱也类似
    
    mail = yagmail.SMTP(user=username,
                        password=passwd,
                        host='smtp.qq.com',#其他服务器就smtp.qq.com  smtp.126.com
                        smtp_ssl=True
                        ) #如果用的是qq邮箱或者你们公司的邮箱使用是安全协议的话,必须写上 smtp_ssl=True
    mail.send(
        to=['to@qq.com',], #如果多个收件人的话,写成list就行了,如果只是一个账号,就直接写字符串就行to='username@qq.com'
        cc='cc@qq.com',#抄送
        subject=title,#邮件标题
        contents=msg)#邮件正文,附件如果只有一个的话,用字符串就行



NETWORK_STATUS = True # 判断状态变量
url = "http://www.example.com"
try:
    response = requests.get(url, headers={
    "user-agent": "aliyun_monitor_Python-urllib/cjavapy",
    "accept-encoding": "gzip"
}, data={}, timeout=50)
    if response.status_code != 200:
        NETWORK_STATUS = False
except requests.exceptions.Timeout:
    NETWORK_STATUS = False # 请求超时改变状态

    if e == requests.exceptions.Timeout and NETWORK_STATUS == False:
        '''请求超时'''
        for i in range(1, 3):
            print('请求超时,第%s次重复请求' % i)
            sendEmail("服务异常",'请求超时,第%s次重复请求' % i)
            try:
                response = requests.get(url, headers={
                "user-agent": "aliyun_monitor_Python-urllib/cjavapy",
                "accept-encoding": "gzip"
}, data={}, timeout=50)
                if response.status_code == 200:
                    NETWORK_STATUS = True
                    continue
            except requests.exceptions.Timeout:
                NETWORK_STATUS = False
except Exception as e:
    sendEmail("服务异常",str
(e))
    NETWORK_STATUS = False
if NETWORK_STATUS == False:
    os.system("supervisorctl restart all")