应使用 tar 命令配合计划任务备份指定子目录,如 tar -zcf /www/backup/uploads_$(date +\%Y\%m\%d_\%H\%M).tar.gz -C /www/wwwroot/example.com uploads,并添加自动清理、校验和日志功能。

备份命令里用 tar 打包指定目录,别用面板自带的“网站备份”功能
宝塔面板默认的“网站备份”只支持整站或数据库,无法单独备份某个子目录(比如 /www/wwwroot/example.com/uploads)。想备份特定目录,必须绕过图形界面,直接写 shell 命令 + 计划任务。
关键点:路径要绝对、权限要对、压缩包名带时间戳防覆盖。
-
tar -zcf /www/backup/uploads_$(date +\%Y\%m\%d_\%H\%M).tar.gz -C /www/wwwroot/example.com uploads—— 注意-C指定根目录,再跟相对路径uploads,这样解压时不会带冗余层级 - 目标备份路径(如
/www/backup)需存在且宝塔运行用户(通常是www)有写权限:mkdir -p /www/backup && chown www:www /www/backup - 避免用
~或./这类相对路径,计划任务里当前工作目录不固定,必须写绝对路径
在宝塔“计划任务”里添加 Shell 脚本,不是直接粘贴命令
直接在计划任务“Shell 脚本”输入框里写长命令容易出错(比如引号转义、换行截断),也难复用和调试。更稳妥的做法是把命令写进脚本文件,再调用它。
- 新建脚本:
vi /www/backup/backup_uploads.sh,内容为上面的tar命令(记得加#!/bin/bash) - 赋执行权限:
chmod +x /www/backup/backup_uploads.sh - 计划任务类型选“Shell 脚本”,脚本内容填:
/www/backup/backup_uploads.sh - 执行周期按需设,比如每天凌晨 2 点:
0 2 * * *;注意宝塔默认用系统 crond,时区以服务器为准
备份后自动清理 7 天前的旧文件,防止磁盘撑爆
不加清理逻辑的话,备份文件会无限累积。宝塔计划任务本身不提供“保留 N 份”选项,得手动加 find 删除。
在脚本末尾追加一行:
find /www/backup -name "uploads_*.tar.gz" -mtime +7 -delete
说明:
-
-mtime +7表示修改时间超过 7 天的文件(注意不是“创建时间”,tar打包后文件修改时间即打包时间) - 先测试再加
-delete:把命令改成find ... -print看列出哪些文件,确认无误再删 - 如果备份名含空格或特殊字符,
find可能误判,此时改用-name "uploads_[0-9]*.tar.gz"更安全
验证备份是否成功,不能只看计划任务“执行成功”状态
宝塔计划任务显示“执行成功”,只代表 shell 进程退出码为 0,不代表 tar 真打完了、没报错、文件可解压。漏掉这步,可能备份了几个月才发现全是空包。
- 加简单校验:在脚本末尾加
if [ $? -eq 0 ]; then echo "$(date) backup OK" >> /www/backup/backup.log; else echo "$(date) backup FAIL" >> /www/backup/backup.log; fi - 手动抽样解压测试:
tar -tzf /www/backup/uploads_20240501_0200.tar.gz | head -n 5,看是否列出预期文件 - 检查文件大小:
ls -lh /www/backup/uploads_*.tar.gz,如果连续几天都是几 KB,大概率 tar 失败但被忽略
最常被忽略的是 tar 因权限不足跳过某些子目录却仍返回 0,所以日志+抽样缺一不可。

















