记录python使用学习
学习使用:
用zipfile实现压缩,用paramiko来sftp传输,用apscheduler框架设置定时发送
代码:
import os
import subprocess
from subprocess import PIPE
import zipfile
import time
from datetime import datetime
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger
import paramiko
# 功能1:压缩文件夹,排除附件子文件夹attached
def zip_file(target_path, output_path, zip_name):
list_file = []
# 判断压缩对象是否是空文件夹
if len(os.listdir(target_path)) == 0:
z = zipfile.ZipFile(output_path + zip_name, 'w', zipfile.ZIP_DEFLATED)
z.writestr(zipfile.ZipInfo(target_path + '\\'), "")
# 压缩对象下所有文件的路径
else:
for path, dirNames, fileNames in os.walk(target_path):
# 排除附件文件夹
if 'attached' not in path:
if not fileNames and not dirNames:
list_file.append(path)
for file in fileNames:
list_file.append(os.path.join(path, file))
# 添加压缩文件
zf = zipfile.ZipFile(output_path + zip_name, 'w', zipfile.ZIP_DEFLATED)
for i in list_file:
zf.write(i)
zf.close()
if zip_name in os.listdir(output_path):
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " " + zip_name + " 压缩完成!")
print("")
else:
print("压缩失败")
print("")
return
# 功能2:上传文件(只上传单个文件,不上传文件夹)
def sftp_upload(host, port, username, password, file_path, server_path, file_name):
s = paramiko.SSHClient()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy)
s.connect(hostname=host, port=port, username=username, password=password)
sftp = s.open_sftp()
try:
sftp.put(file_path, server_path)
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " " + file_name + " 上传结束!")
except Exception as e:
print('上传失败!', e)
# 定时job1:删除旧的zip、rar文件
def delete_job():
path = '文件地址'
for i in os.listdir(path):
if 'ROOT_' in i and '.zip' in i:
os.remove(path + i)
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " " + "旧备份已删除")
if 'ROOT_' in i and '.rar' in i:
os.remove(path + i)
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " " + "旧备份已删除")
# 定时job2:关闭生产项目
def shutdown_job():
path = r'...\apache-tomcat\bin\shutdown.bat'
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " " + "关闭生产项目")
p = subprocess.Popen(path, shell=False, stdout=PIPE)
p.wait()
if p.returncode == 0:
print("项目关闭成功")
else:
print("项目关闭失败")
# 定时job3:数据库备份bak文件发送至linux服务器
def database_job():
path = '数据库备份地址'
bak_list = []
for i in os.listdir(path):
if '...' + datetime.now().strftime('%Y%m%d') in i:
bak_list.append(i)
if len(bak_list) != 0:
bak_name = bak_list[len(bak_list) - 1]
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " " + "开始上传数据库备份bak文件")
sftp_upload('服务器地址', 端口, 'root', '123456',
path + bak_name,
'/home/D/backup/' + bak_name, bak_name)
# 关闭sql server服务
def stop_mssql_job():
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " " + "关闭sql server服务")
p = subprocess.Popen("net stop MSSQLserver /y", shell=False, stdout=PIPE)
p.wait()
if p.returncode == 0:
print("sql server关闭成功")
else:
print("sql server关闭失败")
# 压缩数据库日志文件夹并发送至linux服务器
def mssql_job():
# 首先删除上周的旧压缩包
delete_mssqlzip()
# 压缩文件夹前先关闭sql server服务
stop_mssql_job()
# 压缩
weekday = datetime.now().isoweekday()
zip_time = datetime.now()
zip_name = 'MSSQL_DATA_' + zip_time.strftime('%Y%m%d') + '.zip'
if weekday == 5 and 220500 <= int(zip_time.strftime("%H%M%S")) <= 235959:
print(zip_time.strftime("%Y-%m-%d %H:%M:%S") + " " + "开始压缩MSSQL\\DATA文件夹~")
zip_file(r'D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA',
'E:\\数据库备份\\MSSQL备份\\', zip_name)
# 延时5s,然后上传压缩包
time.sleep(5)
if zip_name in os.listdir('E:\\数据库备份\\MSSQL备份\\'):
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " " + "开始上传MSSQL压缩包")
sftp_upload('目标服务器地址', 端口, 'root', '123456',
'E:/数据库备份/MSSQL备份/' + zip_name,
'/home/D/backup/mssql/' + zip_name, zip_name)
# 上传结束后开启sql server服务
start_mssql_job()
# 删除旧压缩包
def delete_mssqlzip():
path = 'E:\\数据库备份\\MSSQL备份\\'
for i in os.listdir(path):
if 'MSSQL_DATA_' in i and '.zip' in i:
os.remove(path + i)
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " " + "旧MSSQL备份已删除")
# 打开sql server服务
def start_mssql_job():
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " " + "开启sql server服务")
p = subprocess.Popen("net start MSSQLserver", shell=False, stdout=PIPE)
p.wait()
if p.returncode == 0:
print("sql server开启成功")
else:
print("sql server开启失败")
# 定时job4:压缩指定路径的文件,压缩结束后将压缩包发送至linux服务器
def zip_job():
weekday = datetime.now().isoweekday()
zip_time = datetime.now()
zip_name = 'ROOT_' + zip_time.strftime('%Y%m%d') + '.zip'
if weekday == 5 and 220500 <= int(zip_time.strftime("%H%M%S")) <= 235959:
print(zip_time.strftime("%Y-%m-%d %H:%M:%S") + " " + "开始压缩ROOT文件夹~")
zip_file(r'E:\apache-tomcat\webapps\ROOT', 'E:\\', zip_name)
# 延时5s,然后上传压缩包
time.sleep(5)
if zip_name in os.listdir('E:\\'):
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " " + "开始上传项目压缩包")
sftp_upload('目标服务器地址', 端口, 'root', '123456',
'E:/' + zip_name,
'/home/D/backup/code/' + zip_name, zip_name)
time.sleep(5)
# 上传完ROOT压缩包后直接启动项目
startup_job()
# 定时job5:启动生产项目
def startup_job():
path = r'E:\apache-tomcat\bin\startup.bat'
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " " + "重启生产项目")
p = subprocess.Popen(path, shell=False, stdout=PIPE)
p.wait()
if p.returncode == 0:
print("项目启动成功")
else:
print("项目启动失败")
def zip_start():
print("*************************************************脚本信息***************************************************")
print("每周五晚上开始工作")
print("(1)需要被压缩的目录为:E:\\apache-tomcat\\webapps\\ROOT")
print(" 压缩包存放的目录为:E:\\")
print(" 压缩包名为:ROOT_+压缩时间.zip")
print("(2)需要被压缩的目录为:D:\\Program Files\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER\\MSSQL\\DATA")
print(" 压缩包存放的目录为:E:\\数据库备份\\MSSQL备份\\")
print(" 压缩包名为:MSSQL_DATA_+压缩时间.zip")
print("")
print("step1: 21:55删除文件夹E:\\下名称包含ROOT_的zip和rar文件")
print("step2: 22:01关闭项目")
print("step3: 22:05将数据库备份发送至linux服务器(navicat在22:02进行备份生成bak文件:XGML_'%Y%m%d'_'%H%M%S'.bak)")
print("step4: 22:15压缩数据库日志文件夹MSSQL10_50.MSSQLSERVER\\MSSQL\\DATA,压缩结束后自动将压缩包发送至linux服务器")
print("step5: 22:25压缩项目文件夹ROOT,压缩结束后自动将压缩包发送至linux服务器(压缩文件夹中排除了附件文件夹attached)")
print("step6: ROOT传输结束后启动项目")
print("***********************************************************************************************************")
if __name__ == '__main__':
zip_start()
scheduler = BlockingScheduler()
# 每周五21:55:00执行zip_delete
trigger1 = CronTrigger(day_of_week='fri', hour=21, minute=55, second=0)
scheduler.add_job(delete_job, trigger1, misfire_grace_time=300)
# 每周五22:01:00执行shutdown_job
trigger2 = CronTrigger(day_of_week='fri', hour=22, minute=1, second=0)
scheduler.add_job(shutdown_job, trigger2)
# 每周五22:05:00执行database_job
trigger3 = CronTrigger(day_of_week='fri', hour=22, minute=5, second=0)
scheduler.add_job(database_job, trigger3, misfire_grace_time=300)
# 每周五22:15:00执行mssql_job
trigger6 = CronTrigger(day_of_week='fri', hour=22, minute=15, second=0)
scheduler.add_job(mssql_job, trigger6, misfire_grace_time=300)
# 每周五22:25:00执行zip_job
trigger4 = CronTrigger(day_of_week='fri', hour=22, minute=25, second=0)
scheduler.add_job(zip_job, trigger4)
# 每周六03:00:00执行startup_job
# trigger5 = CronTrigger(day_of_week='sat', hour=3, minute=0, second=0)
# scheduler.add_job(startup_job, trigger5)
try:
scheduler.start()
except(KeyboardInterrupt, SystemExit):
scheduler.shutdown()