前两篇文章讲解了python的定时任务框架apscheduler基础用法和为知笔记的部署。
今天讲一下如何让服务器定时备份数据。
为了防止意外,数据最好是每天都备份,并且最好备份到另外的硬盘上(可以买一块云硬盘,挂载到服务器上(我是在腾讯云做活动买的,15块钱买了100g3年))。
但是每天都人工备份的话,可行性较低。所以计划用apscheduler框架定时触发备份任务。
任务目标:
1、每隔2小时定时备份为知笔记的文件目录数据
2、发送备份成功还是失败的结果
先看效果图:
步骤:
1、新建一个文件pybak_1.py,用于触发备份命令。
import os
import time
import smtplib
from email.mime.text import mimetext
from email.mime.multipart import mimemultipart
from email.utils import formataddr
import sys
def mail_sender(info_msg, to_mail):
# 定义邮件
my_sender = '[email protected]' #发送邮箱,这里是以qq邮箱为例
my_pass = 'xxxxxxxxxxxx' # 这个授权码,是在qq邮箱里账户设置里设置的三方授权码。用pop3,就是python脚本中登录邮箱时的密码,而不是你平时登录邮箱时的那个密码
receiver = [formataddr(('cx', to_mail))]
server = smtplib.smtp_ssl("smtp.qq.com", 465)
# 设置邮件内容
# mimemultipart类可以放任何内容
msg = mimemultipart()
content = info_msg
# 把内容加进去
msg.attach(mimetext(content, 'plain', 'utf-8'))
# 设置邮件主题
msg['subject'] = info_msg
server.login(my_sender, my_pass)
server.sendmail(my_sender, receiver, msg.as_string())
server.quit()
source = ['/data/wizdata/'] # 为知笔记所在的目录
target_dir = '/data1/wiz_bak/' # 要备份到哪里
today = target_dir time.strftime('%y%m%d')
now = time.strftime('%h%m%s')
if not os.path.exists(today):
os.mkdir(today)
print('successfully created directory'), today
target = today os.sep now '.zip'
zip_command = "zip -qr '%s' %s" % (target, ' '.join(source))
print(zip_command)
suc_msg = 'wiz笔记备份成功' time.strftime('%y%m%d%h%m')
error_msg = 'wiz笔记备份失败' time.strftime('%y%m%d%h%m')
try:
if os.system(zip_command) == 0:
print('successful backup to', target)
mail_sender(suc_msg, '[email protected]') # 这里改成接受邮箱
else:
print('failed backup to', target)
mail_sender(error_msg, '[email protected]') # 这里改成接受邮箱
except:
print("备份失败")
print(sys.exc_info())
mail_sender(error_msg, '[email protected]') # 这里改成接受邮箱
这里做了几件事:
1.1、定义了一个发送邮件的函数
1.2、用python执行备份命令
1.3、触发备份命令,并发送邮件
2、创建apscheduler框架的定时任务文件:t_apscheduler.py
import os
from apscheduler.schedulers.blocking import blockingscheduler
from datetime import datetime, date
# os.system : execute the command in a subshell
def execute():
os.system('python pybak_1.py')
scheduler = blockingscheduler()
scheduler.add_job(execute, 'interval', hours=2)
# interval-------------minutes,seconds,hours,days
# scheduler.add_job(execute, 'interval', seconds=1)
scheduler.start()
把参数设置成每隔两小时执行一次:hours=2
3、将文件传到服务器上。
4、在服务器上执行命令
sudo nohup python t_apscheduler.py &
5、tail -f 查看执行结果。
6、检验备份文件,并对比被备份的目录。发现一致。
并且也正常发送了邮件提醒。
目标达成,结束。