Linux通用服务器:手把手配置备份自动过期删除完整步骤
时间:2026年06月03日 23:25:45
来源:易频IT社区
一、前置检查
先确认你的服务器有可操作的终端权限,以及备份文件的具体路径(假设本文备份路径统一为`/data/backups`,如果不同后续同步修改)。
```bash
查看终端是否有sudo权限(普通用户输入此命令需输入密码后通过才算)
sudo whoami
输出应为 root
```
二、方案选型
采用rsync的--max-delete配合logrotate或find定时任务?不,用最通用、无额外依赖(默认所有主流Linux发行版都预装)的方案:`find + crontab`,简单到复制粘贴即可。
三、基础备份过期删除命令(手动测试用)
这一步必须先做,确保不会误删文件!
3.1 查找过期备份(仅查看不删除)
假设保留7天内修改的备份文件(超过7天算过期),执行:
```bash
查找/data/backups目录下,超过7天(mtime +7)的普通文件(f),仅打印路径
find /data/backups -type f -mtime +7 -print
查找/data/backups目录下,超过7天(mtime +7)、大小为0的空文件,仅打印路径
find /data/backups -type f -mtime +7 -size 0 -print
查找/data/backups目录下,超过7天(mtime +7)的空目录(d),仅打印路径
find /data/backups -type d -mtime +7 -empty -print
```
注意:
- `-mtime +7`:修改时间在7天以前(不含第7天当天修改的)
- `-mtime -7`:修改时间在7天以内(含第7天当天修改的)
- `-mtime 7`:修改时间在第7天整(当天00:00-23:59修改的)
- 如果想按「创建时间」删除,部分文件系统(如EXT4带`ext_attr`、XFS带`project quota`)支持`-birthtime +7`,但兼容性不如`-mtime`,生产环境优先用`-mtime`
3.2 安全删除过期备份
确认3.1打印的都是要删的文件后,用不可逆但速度快的`-delete`参数(强烈推荐优先用此参数,不要用xargs rm -rf,更安全):
```bash
先删除过期普通文件(注意顺序!先删文件再删目录,否则空目录条件会失效)
find /data/backups -type f -mtime +7 -delete
再删除过期空文件
find /data/backups -type f -mtime +7 -size 0 -delete
最后删除过期空目录
find /data/backups -type d -mtime +7 -empty -delete
```
如果不小心用了`-delete`但删错了,立即停止服务器写入,用`extundelete`(EXT4)或`xfsrestore`(XFS)尝试恢复,不过本文不涉及恢复内容。
四、定时自动执行过期删除
用Linux默认的`crontab`定时任务,无需安装额外软件。
4.1 编辑root用户的crontab
```bash
建议用root用户编辑,避免权限不足无法删除某些备份
sudo crontab -e
首次编辑会让你选择编辑器,选vim.tiny(默认2号)或nano(1号,新手友好)
```
4.2 添加定时任务(新手直接复制新手友好版)
新手友好版(每天凌晨2点执行,保留7天备份,带操作日志)
在crontab文件末尾另起一行粘贴以下内容(注意修改备份路径和保留天数!):
```bash
注释说明任务
0 2 /bin/find /data/backups -type f -mtime +7 -delete >> /var/log/backup_clean.log 2>&1
0 2 /bin/find /data/backups -type f -mtime +7 -size 0 -delete >> /var/log/backup_clean.log 2>&1
0 2 /bin/find /data/backups -type d -mtime +7 -empty -delete >> /var/log/backup_clean.log 2>&1
```
参数详解
| 定时任务参数 | 含义 |
| | |
| 0 | 第0分钟 |
| 2 | 第2小时(24小时制) |
| | 每月每天 |
| | 每月 |
| | 每周每天 |
| /bin/find | find命令的绝对路径(避免PATH环境变量失效导致找不到命令) |
| >> /var/log/backup_clean.log 2>&1 | 将标准输出和错误输出追加到日志文件(方便排查问题) |
进阶版(每周日凌晨3点执行,保留30天备份,先压缩最近30天以外但不到31天的?不直接删干净,带更详细的日志)
```bash
注释说明任务
0 3 0 (
echo "=== 备份清理任务开始于 $(date '+%Y-%m-%d %H:%M:%S') ==="
/bin/find /data/backups -type f -mtime +30 -delete
/bin/find /data/backups -type f -mtime +30 -size 0 -delete
/bin/find /data/backups -type d -mtime +30 -empty -delete
echo "=== 备份清理任务结束于 $(date '+%Y-%m-%d %H:%M:%S') ==="
) >> /var/log/backup_clean.log 2>&1
```
4.3 保存并退出编辑器
- 用nano的新手:按`Ctrl+O`保存,按`Enter`确认文件名,按`Ctrl+X`退出
- 用vim的老手:按`Esc`,输入`:wq`,按`Enter`保存退出
4.4 确认定时任务已添加
```bash
查看当前root用户的crontab
sudo crontab -l
应该能看到刚才粘贴的内容
```
4.5 测试定时任务(可选但推荐新手做)
手动触发定时任务,不用等凌晨2/3点:
```bash
先创建一个临时的、超过7天的测试文件
sudo touch -d "8 days ago" /data/backups/test_expired_file.txt
查看当前root用户的定时任务ID(第一列数字)
sudo crontab -u root -l | cut -f1 -d' ' | head -1
假设第一列数字是0,第二列是2,手动触发所有root用户的定时任务(立即执行)
sudo runuser -l root -c 'crontab -l | grep -v "^" | while read line; do eval "$line"; done'
查看测试文件是否被删除
ls -l /data/backups/test_expired_file.txt
输出应为 ls: cannot access '/data/backups/test_expired_file.txt': No such file or directory
查看日志文件是否有记录
tail -20 /var/log/backup_clean.log
```
五、日志管理(防止日志文件过大)
如果定时任务每天执行,日志文件会越来越大,用`logrotate`(默认所有主流Linux发行版都预装)自动分割和删除旧日志:
5.1 创建logrotate配置文件
```bash
用sudo编辑新的配置文件
sudo nano /etc/logrotate.d/backup_clean
```
5.2 粘贴完整配置(直接复制即可)
```bash
/var/log/backup_clean.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0644 root root
}
```
5.3 保存并退出编辑器
和4.3步骤一样。
5.4 测试logrotate配置
```bash
手动触发logrotate配置测试
sudo logrotate -d /etc/logrotate.d/backup_clean
输出中应该没有错误信息
手动强制触发logrotate配置
sudo logrotate -f /etc/logrotate.d/backup_clean
查看/var/log目录下是否有分割后的压缩日志
ls -l /var/log/backup_clean.log
```
六、生产环境注意事项
1. 必须先手动测试删除命令:就是3.1和3.2的步骤,确认无误再加入定时任务
2. 备份路径必须精准:不要写`/`或`/data`,只写备份文件所在的目录
3. 日志文件权限要正确:root用户的crontab生成的日志,owner和group都应该是root
4. 可以定期备份重要备份:比如将最近7天的备份同步到另一台服务器或云存储,防止误删后无法恢复
5. 如果有多种类型的备份:比如数据库备份、文件备份,可以分别配置不同的find命令和crontab任务