目录结构如下:
dbcorn.py
if __name__ == "__main__":
from datetime import datetime
import sched
import time,os
from datetime import datetime
retval = os.getcwd()
# 初始化sched模块的 scheduler 类
# 第一个参数是一个可以返回时间戳的函数,第二个参数可以在定时未到达之前阻塞。
schedule = sched.scheduler(time.time, time.sleep)
def delete():
import os, datetime
ds = list(os.walk("./backup")) # 获得所有文件夹的信息列表
delta = datetime.timedelta(days=30) # 这里方便测试可以设置成0,也就是把这个文件夹下的所有文件都删除了
now = datetime.datetime.now() # 获取当前时间
for d in ds: # 遍历该列表
os.chdir(d[0]) # 进入本级路径,防止找不到文件而报错
if d[2] != []: # 如果该路径下有文件
for x in d[2]: # 遍历这些文件
# print(x)
ctime = datetime.datetime.fromtimestamp(os.path.getctime(x)) # 获取文件创建时间
# print(ctime)
if ctime < (now - delta): # 若创建于delta天前
os.remove(x) # 则删掉
os.chdir(retval) # 进入本级路径,防止找不到文件而报错
# 被周期性调度触发的函数
def backsql(inc):
os.system("./dmb.sh")
delete()
schedule.enter(inc, 0, backsql, (inc,))
# 默认参数60s
def main(inc=60):
# enter四个参数分别为:间隔事件、优先级(用于同时间到达的两个事件同时执行时定序)、被调用触发的函数,
# 给该触发函数的参数(tuple形式)
schedule.enter(0, 0, backsql, (inc,))
schedule.run()
# 立马执行一次 2个小时备份一次
main(7200)
dmb.sh
#!/usr/bin/env bash
CRTDIR=$(pwd)
# 判断是否有upload文件夹,没有则创建,用于存储图片
if [ ! -d "${CRTDIR}/backup" ]; then
mkdir ${CRTDIR}/backup
fi
DATE=`date +%Y%m%d%H%M%S`
BACK_DATA=backup-${DATE}.sql
docker exec -i db mysqldump -uroot -ppassword mytestdb > ${CRTDIR}/backup/${BACK_DATA}
# docker exec -i [容器名字] mysqldump -uroot -p[密码] [数据名字]> ${CRTDIR}/backup/${BACK_DATA}
start.sh
#! /bin/sh
PROCESS=`ps -ef|grep dbcorn.py|grep -v grep|grep -v PPID|awk '{ print $2}'`
for i in $PROCESS
do
echo "Kill the dbcorn process [ $i ]"
kill -9 $i
done
cd /mnt/disk/home/mysql # cd到脚本所在目录
nohup python3 -u dbcorn.py > nohup.log 2>&1 &
然后给这两个sh脚本执行权限
然后执行 ./start.sh