公司有一台静态页面展示服务器仅供给客户展示我们做的项目,当时买的时候是最低配,也就是磁盘空间为20G的系统盘,考虑到代码量很小所以没有另加磁盘,后来项目多了,就写了个crontab 定时备份目录。

就这样,这台服务器稳健运行着。过了大半年,突然有一天挂在该服务器上的wordpress登陆不了了。找了好久找不到问题。不经意之间看来下磁盘利用率才发现了问题。

使用命令:

  1. df -h

发现磁盘/dev/xvdal没空间了!

导致缓存与session无法保存。想起来可能是备份目录导致的,10几个项目,一个项目10Mb左右每天备份一次,半年时间:10*10*150=15GB(项目是逐渐加进去的),删除某一天的备份,重新登录wordpress真给登录上去了。

如果知道了是备份的问题,定期删除备份文件也行。但爱折腾的人肯定是闲不下来的。干嘛要备份到服务器中呢,完全可以打包把备份文件通过邮件进行备份呀。就这样定时Python备份目录发送邮件功能变成了“现实”。

一.crontab定时

  1. crontab -e
  1. * * * /root/crontab-save-code.py #每天凌晨1点30分执行备份目录

二.打包目录

  1. # 压缩目录toZip
  2. def DirToZip(dirname, zipfilename):
  3. filelist = []
  4. if os.path.isfile(dirname):
  5. filelist.append(dirname)
  6. else:
  7. for root, dirs, files in os.walk(dirname):
  8. for name in files:
  9. filelist.append(os.path.join(root, name))
  10.  
  11. try:
  12. zf = zipfile.ZipFile(zipfilename, "w", zipfile.zlib.DEFLATED)
  13. for tar in filelist:
  14. arcname = tar[len(dirname):]
  15. try: # 异常出现在文件名为中文
  16. zf.write(tar, arcname)
  17. except:
  18. zf.write(tar, repr(arcname)[1:-1])
  19. zf.close()
  20. return True
  21. except Exception as e:
  22. return False

生成ZIP压缩文件时有个问题,压缩到一半报错:

  1. 'utf-8' codec can't encode character '\udcb8' in position 41: surrogates not allowed

编码的问题,文件使用中文名导致的,参考:http://python3-cookbook.readthedocs.io/zh_CN/latest/c05/p15_printing_bad_filenames.html

三.发送带附件的邮件

  1. # 发送邮件
  2. def sendMail():
  3. print(ZipName)
  4. # 输入Email地址和口令:
  5. from_addr = 'admin@****.com'
  6. password = ''
  7. # 输入收件人地址:
  8. to_addr = '*****@163.com'
  9. # 输入SMTP服务器地址:
  10. smtp_server = 'smtp.exmail.qq.com'
  11.  
  12. # 邮件对象:
  13. msg = MIMEMultipart()
  14. msg['From'] = _format_addr('自动备份项目代码 <%s>' % from_addr)
  15. msg['To'] = _format_addr('Web管理员 <%s>' % to_addr)
  16. msg['Subject'] = Header('来自SMTP-定时备份……', 'utf-8').encode()
  17.  
  18. # 邮件正文是MIMEText:
  19. msg.attach(MIMEText('自动备份项目代码 file...', 'plain', 'utf-8'))
  20.  
  21. # 添加附件就是加上一个MIMEBase,从本地读取一个图片:
  22. with open(filePath, 'rb') as f:
  23. # 设置附件的MIME和文件名,这里是png类型:
  24. mime = MIMEBase('image', 'png', filename='test.png')
  25. # 加上必要的头信息:
  26. mime.add_header('Content-Disposition', 'attachment', filename=ZipName)
  27. mime.add_header('Content-ID', '<0>')
  28. mime.add_header('X-Attachment-Id', '')
  29. # 把附件的内容读进来:
  30. mime.set_payload(f.read())
  31. # 用Base64编码:
  32. encoders.encode_base64(mime)
  33. # 添加到MIMEMultipart:
  34. msg.attach(mime)
  35. try:
  36. server = smtplib.SMTP(smtp_server, 25)
  37. # server.set_debuglevel(1)
  38. server.login(from_addr, password)
  39. a = server.sendmail(from_addr, [to_addr], msg.as_string())
  40. return True
  41. except Exception:
  42. return False

四. 发送成功,删除压缩包

  1. # 删除文件
  2. def delFile():
  3. if os.path.exists(filePath):
  4. os.remove(filePath)

经测试,在windows很开就收到了,但上传到服务器又报错了:

  1. /usr/bin/python^M: bad interpreter: No such file

是因为windows行结尾和linux行结尾标识不同造成的。使用notepad++把文件转换为UNIX格式。

完整代码:

  1. #!/usr/bin/python
  2. # coding=utf-8
  3. import os, os.path
  4. import zipfile
  5. from email import encoders
  6. from email.header import Header
  7. from email.mime.base import MIMEBase
  8. from email.mime.multipart import MIMEMultipart
  9. from email.mime.text import MIMEText
  10. from email.utils import parseaddr, formataddr
  11. import smtplib
  12. import datetime
  13. import os
  14.  
  15. ZipName = datetime.datetime.now().strftime('%Y-%m-%d@%H.%M') + '.zip'
  16. filePath = "/home/wwwroot/tools/backup/" + ZipName
  17.  
  18. # 压缩目录toZip
  19. def DirToZip(dirname, zipfilename):
  20. filelist = []
  21. if os.path.isfile(dirname):
  22. filelist.append(dirname)
  23. else:
  24. for root, dirs, files in os.walk(dirname):
  25. for name in files:
  26. filelist.append(os.path.join(root, name))
  27.  
  28. try:
  29. zf = zipfile.ZipFile(zipfilename, "w", zipfile.zlib.DEFLATED)
  30. for tar in filelist:
  31. arcname = tar[len(dirname):]
  32. try: # 异常出现在文件名为中文
  33. zf.write(tar, arcname)
  34. except:
  35. zf.write(tar, repr(arcname)[1:-1])
  36. zf.close()
  37. return True
  38. except Exception as e:
  39. return False
  40.  
  41. # 格式字符串
  42. def _format_addr(s):
  43. name, addr = parseaddr(s)
  44. return formataddr((Header(name, 'utf-8').encode(), addr))
  45.  
  46. # 发送邮件
  47. def sendMail():
  48. print(ZipName)
  49. # 输入Email地址和口令:
  50. from_addr = 'admin@****.com'
  51. password = ''
  52. # 输入收件人地址:
  53. to_addr = '****@163.com'
  54. # 输入SMTP服务器地址:
  55. smtp_server = 'smtp.exmail.qq.com'
  56.  
  57. # 邮件对象:
  58. msg = MIMEMultipart()
  59. msg['From'] = _format_addr('自动备份项目代码 <%s>' % from_addr)
  60. msg['To'] = _format_addr('Web管理员 <%s>' % to_addr)
  61. msg['Subject'] = Header('来自SMTP-定时备份……', 'utf-8').encode()
  62.  
  63. # 邮件正文是MIMEText:
  64. msg.attach(MIMEText('自动备份项目代码 file...', 'plain', 'utf-8'))
  65.  
  66. # 添加附件就是加上一个MIMEBase,从本地读取一个图片:
  67. with open(filePath, 'rb') as f:
  68. # 设置附件的MIME和文件名,这里是png类型:
  69. mime = MIMEBase('image', 'png', filename='test.png')
  70. # 加上必要的头信息:
  71. mime.add_header('Content-Disposition', 'attachment', filename=ZipName)
  72. mime.add_header('Content-ID', '<0>')
  73. mime.add_header('X-Attachment-Id', '')
  74. # 把附件的内容读进来:
  75. mime.set_payload(f.read())
  76. # 用Base64编码:
  77. encoders.encode_base64(mime)
  78. # 添加到MIMEMultipart:
  79. msg.attach(mime)
  80. try:
  81. server = smtplib.SMTP(smtp_server, 25)
  82. # server.set_debuglevel(1)
  83. server.login(from_addr, password)
  84. a = server.sendmail(from_addr, [to_addr], msg.as_string())
  85. return True
  86. except Exception:
  87. return False
  88.  
  89. # 删除文件
  90. def delFile():
  91. if os.path.exists(filePath):
  92. os.remove(filePath)
  93.  
  94. if __name__ == '__main__':
  95. zipfile = DirToZip(r'/home/wwwroot/www', filePath)
  96. if zipfile:
  97. sending = sendMail()
  98. if sending:
  99. delFile()

成功发送邮件:

Python +crontab定时备份目录发送邮件的更多相关文章

  1. Linux下使用crontab定时备份日志

    上周学习了Linux,其中有使用crontab定时备份日志的内容,现把主要步骤记录如下: 首先需要备份的日志的源目录位于/opt/lampp/logs/access_log 备份到/tmp/logs下 ...

  2. linux下使用crontab定时备份MYSQL数据库的方法:

    摘要 linux下使用crontab定时备份MYSQL数据库的方法: 只需按照下面3步做,一切都在你的掌控之下: 第一步:在服务器上配置备份目录代码: ------------------------ ...

  3. MySQL定时备份之使用Linux下的crontab定时备份实例

    这篇文章主要介绍了使用Linux下的crontab进行MySQL定时备份的例子,需要的朋友可以参考下   复制代码代码如下: ##################################### ...

  4. Linux下MySQL备份以及crontab定时备份

    1. 备份某个数据库 ################################################################## # 备份某个数据库 ############ ...

  5. MySQL使用crontab定时备份不执行问题

    在使用crontab定时备份数据库时,发现并没有执行备份命令. 下面是定时备份的代码: 30 1 * * * /usr/local/mysql/bin/mysqldump --defaults-ext ...

  6. 使用python脚本定时备份web网站

    #!/usr/bin/env python #-*- coding: utf-8 -*- import os import time # 备份的指定目录 source = ['/data/www/Ad ...

  7. Gitlab备份,Crontab定时备份

    1:Gitlab备份非常简单,只需要一条命令就可以创建完整的备份 gitlab-rake gitlab:backup:create 使用以上命令,就相当于在/var/opt/gitlab/backup ...

  8. Linux 使用crontab定时备份Mysql数据库

    项目中数据库的数据是至关重要的!在实际项目中,遇到有客户机房断电导致数据库数据丢失的问题,又因为备份容灾不及时,导致部分数据恢复不了,而刚好这部分丢失的数据对于客户来说又是至关重要的,那么怎么办呢?盲 ...

  9. python - 代码练习 - 备份目录/文件(windos环境)

    备份目录/文件 import zipfile import os,datetime class beifen(object): def __init__(self,files,new_files,co ...

随机推荐

  1. zapewnia stale poprawiając relacje związane

    W porównaniu do LG5, ta http://www.butyrunning.com/lunarestoa-2-m%C3%84%C2%99skie-c-2_70_71.html kon ...

  2. 耗电—Android

    Android应用耗电分析与优化 http://sanwen8.cn/p/297Ut7b.html http://www.cnblogs.com/kobe8/p/3819305.html 有效控制An ...

  3. gprs/gsm 在linux下的应用

    之前有篇随笔整理了一种在裸机下用状态机+超时的机制来操作gprs/gsm,linux下就不需要了,本身有完善的调度机制,在等待的流程中直接sleep就行了. 下面是飞凌OK6410下的 demo, 其 ...

  4. AVL树

    AVL树 在二叉查找树(BST)中,频繁的插入操作可能会让树的性能发生退化,因此,需要加入一些平衡操作,使树的高度达到理想的O(logn),这就是AVL树出现的背景.注意,AVL树的起名来源于两个发明 ...

  5. [转]MySQL索引背后的数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  6. Fiddler将笔记本设置代理,抓取手机网络请求包

    第一步:下载fiddler,下载地址:http://www.telerik.com/download/fiddler 第二步:安装fiddler,略过... 第三步:启动fiddler,启动后界面如下 ...

  7. android 选择图片或拍照时旋转了90度问题

    由于前面的博文中忽略了点内容,所以在这里补上,下面内容就是解决拍照或者选择图片显示的时候图片旋转了90度或者其他度数问题,以便照片可以正面显示:具体如下: 首先直接看上面博文下的拍完照或者选完图后处理 ...

  8. test1.xlsx

    耿丹CS16-2班第三次作业汇总 排名 学号后三位 姓名 作业顺序 作业情况 第三周博客 总得分 博客园地址 1 232 周* 1 8.5 3 12.5 http://www.cnblogs.com/ ...

  9. MAC实用的小工具

    一.XtraFinder(右键菜单扩展) http://www.xuebuyuan.com/173454.html http://www.mamicode.com/info-detail-111618 ...

  10. tengine/nginx-tomcat动静分离遇到的问题

    小站安装好tengine后,接下来的工作就是要配置好tengine让其和后端的tomcat正常的连接工作起来,tengine的配置文件本身比较简单,网上有大量的相关介绍说明文档,我这里只是摘出我配置过 ...