零基础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% 的情况都能解决。