检查备份,失败发邮件报警

受朋友的激励,在这写下写下点东西

背景:用shell做的全备,但是可能存在备份失败的情况,所以检查备份(通过检查备份的方式),如果看到有错误就发邮件报警。

 备份代码写的很烂,贴上:

#!/bin/sh
#
DFILE=$1
SOCK=$2
DB_NAME=$3

DB_USER="mysqlbak"
DB_PASS="***"
BCK_DIR="/var/backup/$DB_NAME"
FNAME=`date +%Y%m%d_%H%M%S`
HOST=`ip r|grep src|awk '{print $9}'`
LOGFILE="$BCK_DIR/backup.log"

log() {
        echo "$FNAME $HOST $1" >> $LOGFILE
        }


if [ ! -e $BCK_DIR ];then
        mkdir -p $BCK_DIR
        if [ $? -ne 0 ];then
                log "mkdir $BCK_DIR failure."
                exit 2
        fi
fi


log "Start full backup..."
innobackupex --defaults-file=$DFILE --user=$DB_USER --password=$DB_PASS --socket=$SOCK --parallel=4 --no-timestamp $BCK_DIR/$FNA
ME

if [ $? -eq 0 ];then
        log "Today's full backup successful."
        log "Start compress backup file."
        cd $BCK_DIR
        tar cf - $FNAME | pigz -p 4 > $FNAME.tar.gz
        if [ $? -eq 0 ];then
                rm -rf $FNAME
                log "compress backup file successful."
                find $BCK_DIR/ -mtime +20 rm -rf {} \;
        else
                log "compress backup file failure."
        fi
else
        log "Today's full backup failure."
fi

find $BCK_DIR/ -type f -mtime +20 -delete

检查脚本贴上:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import os
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr

def checkLog(date):
    logFile = '/var/backup/backup.log'
    if not os.path.exists(logFile):
        print("log not exist")
    global Host,Date
    Host=Date=None
    with open(logFile,'r') as fd:
        lines = fd.readlines()

    for line in lines:
        if date in line:
            if 'failure' and 'full' in line:
                Host=line.split()[0]
                Date=line.split()[1]
            elif 'failure' and 'compress' in line:
                Host=line.split()[0]
                Date=line.split()[1]
    if Host == None:
        print("%s backup not exist"%date)
    else:
        ret = mail(Host,Date)
        if ret:
            print("sendmail success")
        else:
            print("sendmail failed")

def mail(Host,Date):

    msgFrom = '***@163.com'  # 发件人邮箱账号
    msgPasswd = '***'  # 发件人邮箱授权码
    msgTo = '***'  # 收件人邮箱账号
    msgCo = ''  # 抄送邮箱账号

    ret = True

    msg = MIMEText("备份失败"+ Host + Date, 'plain', 'utf-8')
    msg['From'] = formataddr(["hushi", msgFrom])  # 括号里的对应发件人邮箱昵称、发件人邮箱账号
    msg['To'] = formataddr(["dba", msgTo])  # 括号里的对应收件人邮箱昵称、收件人邮箱账号
    msg['Subject'] = "【报警】"  # 邮件的主题,也可以说是标题
    try:
        server = smtplib.SMTP_SSL("smtp.163.com", 465)  # 发件人邮箱中的SMTP服务器,端口是25
        server.login(msgFrom, msgPasswd)  # 括号中对应的是发件人邮箱账号、邮箱密码
        server.sendmail(msgFrom, msgTo.split(',')+ msgCo.split(','),msg.as_string())

        server.quit()  # 关闭连接
    except Exception:  # 如果 try 中的语句没有执行,则会执行下面的 ret=False
        ret = False
    return ret

checkLog('20180805')

逻辑:这个检查脚本传入一个日期参数,会去一行行读日志文件,看到相应的日期,然后再去判断。如果检测到failure就是失败了,就去发邮件,没有检测到failure就是成功了,就不管。

报警的内容格式这一块儿可以调调,因为到时候要写进平台里,直接通过django提供的模块发邮件,这里就没有改了,思路知道就可以了。

转载于:https://www.cnblogs.com/hs2021/p/9449382.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值