直接用 shell 脚本 + crontab 实现日志自动备份与清理,脚本需使用绝对路径、带时间戳命名、自动创建目录、清理7天前文件,并通过日志记录和校验确保可靠性。

直接用 shell 脚本 + crontab 就能实现日志的自动备份与清理,关键在于脚本要健壮、路径要绝对、执行环境要明确,避免“定时任务跑了但没备份成功”的静默失败。
写一个带时间戳和自动清理的备份脚本
脚本需独立运行、命名不冲突、旧文件自动删。例如备份 /var/log/nginx:
- 用 date +%Y%m%d_%H%M 生成精确到分钟的时间戳,防止同名覆盖
- 目标目录(如 /backup/logs/nginx)用 mkdir -p 创建,确保路径存在
- 用 /usr/bin/find(绝对路径)清理 7 天前的 *.tar.gz 文件:find /backup/logs/nginx -name "*.tar.gz" -mtime +7 -delete
- 所有命令写绝对路径,比如 /bin/tar、/usr/bin/rsync,避免 crontab 环境下找不到命令
赋予权限并手动验证脚本
脚本不是写完就能用,必须确认它当前用户下真能跑通:
- 执行 chmod +x /path/to/backup_logs.sh 赋予可执行权限
- 直接运行:/path/to/backup_logs.sh
- 检查是否生成了压缩包:ls -l /backup/logs/nginx/*.tar.gz
- 用 tar -tzf 抽检一个包,确认内容完整;若报 “command not found”,说明脚本里用了未声明路径的命令,需补全
用 crontab 添加定时任务(带环境变量)
推荐用当前用户 crontab(crontab -e),避免权限干扰:
- 格式固定为:分 时 日 月 周 命令,例如 0 2 * * * /home/user/backup_logs.sh 表示每天凌晨 2 点执行
- 务必写脚本的绝对路径,crontab 不读取你的 shell 环境变量
- 在 crontab 条目开头显式声明 PATH 和 HOME:
PAGE=/usr/local/bin:/usr/bin:/bin HOME=/home/user
0 2 * * * /home/user/backup_logs.sh
加日志和错误捕获,让每次执行都可追踪
静默失败最危险,必须留下痕迹:
- 在 crontab 行末加重定向:0 2 * * * /home/user/backup_logs.sh >> /var/log/backup.log 2>&1
- 或在脚本内部用 echo "$(date): backup start" >> /var/log/backup.log 记关键节点
- 备份后加校验逻辑,比如 tar -tzf $BACKUP_FILE >/dev/null 2>&1 || { echo "校验失败"; exit 1; }











