零基础Python自动化运维脚本案例:自动备份网站目录

为什么要用Python脚本做自动备份

在日常服务器运维中,网站文件备份是最基础也最容易被忽略的工作。
手动备份费时、容易漏,一旦出故障恢复起来非常麻烦。
Python自动化运维脚本 来执行备份任务,只需写一次脚本,配合定时任务就能长期稳定运行。
这里分享一个我在生产环境用了很久的备份脚本案例,它可以自动压缩网站目录、按日期命名、清理超过30天的旧备份,整个过程完全自动化。

开始前需要准备什么

  • 一台 Linux 服务器(本文以 Ubuntu 20.04 为例,CentOS 操作类似)
  • Python 3 环境(通常系统自带,可通过 python3 --version 确认)
  • 知道你的网站目录路径(例如 /var/www/html
  • 有一个用于存放备份的目录(例如 /backup),并且有写入权限
如果您的服务器是宝塔面板,可以使用面板的计划任务功能,但本文更聚焦命令行操作,方便理解底层逻辑。

编写备份脚本

在任意位置新建文件,比如 /usr/local/bin/backup_website.py,并写入以下代码:

#!/usr/bin/env python3
import os
import shutil
import datetime
import glob

# ============ 自定义配置 ============
SOURCE_DIR = "/var/www/html"          # 要备份的网站目录
BACKUP_BASE = "/backup"              # 备份存放根目录
RETENTION_DAYS = 30                   # 保留天数,超过此天数的备份会被清理
# ====================================

# 生成备份文件名:backup_网站名_20250327_1430.tar.gz
today = datetime.datetime.now()
backup_filename = f"backup_site_{today.strftime('%Y%m%d_%H%M')}.tar.gz"
backup_path = os.path.join(BACKUP_BASE, backup_filename)

# 确保备份目录存在
os.makedirs(BACKUP_BASE, exist_ok=True)

# 使用 tar 命令打包压缩(shutil 没有直接打包功能,用 subprocess 更可靠)
import subprocess
result = subprocess.run(
    ["tar", "-czf", backup_path, "-C", os.path.dirname(SOURCE_DIR), os.path.basename(SOURCE_DIR)],
    capture_output=True, text=True
)

if result.returncode != 0:
    print(f"[ERROR] 备份失败: {result.stderr}")
    exit(1)
else:
    print(f"[OK] 备份成功: {backup_path}")

# 清理超过 RETENTION_DAYS 天的旧备份
cutoff = datetime.datetime.now() - datetime.timedelta(days=RETENTION_DAYS)
for f in glob.glob(os.path.join(BACKUP_BASE, "backup_site_*.tar.gz")):
    # 从文件名提取时间,比如 backup_site_20250327_1430.tar.gz
    basename = os.path.basename(f)
    # 去掉前缀和后缀,只留日期部分
    # 格式固定:backup_site_YYYYMMDD_HHMM.tar.gz
    try:
        date_str = basename.replace("backup_site_", "").replace(".tar.gz", "")
        file_time = datetime.datetime.strptime(date_str, "%Y%m%d_%H%M")
        if file_time < cutoff:
            os.remove(f)
            print(f"[DEL] 删除旧备份: {f}")
    except Exception as e:
        print(f"[WARN] 清理时出错 {f}: {e}")

print("备份任务完成。")

保存后,给脚本添加执行权限:

chmod +x /usr/local/bin/backup_website.py

测试脚本能否正常执行

先用普通用户或 root 执行一次脚本,观察输出:

/usr/local/bin/backup_website.py

如果成功,你会在 /backup 目录下看到类似 backup_site_20250327_1430.tar.gz 的文件。
如果出错,最常见的原因是目录权限不足或源目录不存在。
可以用 ls -l /var/www/html 检查源目录是否存在,用 ls -ld /backup 检查备份目录是否可写。

加入定时任务自动运行

使用 crontab -e 编辑当前用户的定时任务(推荐用 root 或备份目录所有者)。
在文件末尾添加一行:

0 3 * * * /usr/local/bin/backup_website.py >> /var/log/backup_site.log 2>&1

解释:0 3 * * * 表示每天凌晨 3 点执行一次。
执行结果日志会写入 /var/log/backup_site.log,方便后续检查。

保存后,可以用 crontab -l 确认任务已生效。

常见报错和注意事项

问题1:tar: /var/www/html: Cannot stat: No such file or directory
解决:检查 SOURCE_DIR 变量路径是否正确,确保目录存在。如果网站目录是 /var/www/html/(带尾部斜杠),注意代码中 os.path.basename 会变成空字符串,所以请去掉尾部斜杠。

问题2:Permission denied
解决:脚本可能需要 root 权限才能读取源目录并写入备份目录。建议用 root 用户执行或通过 sudo。crontab 也推荐用 sudo crontab -e 编辑 root 的任务。

问题3:备份文件体积过大,磁盘空间不足
解决:调整 RETENTION_DAYS 减少保留天数;或者先手动压缩检查源目录大小,考虑排除缓存目录(比如 --exclude=wp-content/cache)。

问题4:清理旧备份时删除错了文件
解决:严格检查文件名格式,建议第一次运行前先注释掉 os.remove 行,加个 print 观察哪些文件会被删除,确认无误再启用。

如何确认备份任务正常

  • 手动执行一次脚本,检查备份文件完整性:tar -tzf /backup/backup_site_*.tar.gz | head -20 可以列出打包内容。
  • 查看日志文件:tail -20 /var/log/backup_site.log,确认上次执行时间是否正确。
  • 定时任务执行后若能收到邮件告警(默认根用户),检查 /var/mail/root 有无错误输出。
  • 设置一个简单的监控:每天检查备份目录是否存在当天的文件,可通过另一个脚本或系统监控工具实现。

如果你正在处理 Python自动化运维脚本案例,建议先按本文步骤在测试环境跑通,再迁移到生产服务器。
遇到异常时优先回看上面的避坑和高频问题部分,99% 的情况都能解决。

分享到:
上一篇
Shell脚本批量运维实战案例:从零实现服务器批量巡检与修复
下一篇
Docker镜像加速器配置提速:零基础手把手配置指南
1
系统公告

高考专属福利来袭|凭准考证免费领香港 CN2 云服务器

值高考落幕之际,泽御云开启考生专属回馈 + 产品限时特惠双重活动,助力学子暑期学习建站 高考 考生专属福利 全体应届高考生,凭高考准考证即可免费申领【香港 CN2 轻量云服务器,4 核 4G AMD 处理器】,免费使用周期 30 天,可用于搭建个人站点、编程实操、技术实训,祝各位考生金榜题名,前程似锦! 泽御云资质齐全合规自营机房,线路覆盖香港 CN2、国内 BGP、内蒙电信、美国精品线路,售后全天候技术支持。 官方网站:www.zeyuyun.com,活动限时有效,优惠逾期不再保留。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意