!/bin/bashpath=/usr/local/bin:/usr/bin:/bin source="/var/www/html" dest="/backup/www-$(date +\%y\%m\%d)" log="/var/log/backup-sync.log" [ -d "$source" ] || { echo "$(date): error: source $source not found" >> "$log"; exit 1; } [ -w "$(dirname "$dest")" ] || { echo "$(date): error: cannot write to $(dirname "$dest")" >> "$log"; exit 1; } rsync -avz --delete "$source/" "$dest/" >> "$log" 2>&1 rsync -avn "$source/" "$dest/" >> "$log" 2>&1 find /backup -maxdepth 1 -name "www-*" -type d -mtime +30 -delete >> "$log" 2>&1 echo "$(date): sync done → $dest" >> "$log"

用 Crontab 定时同步 Linux 数据备份集,核心是把 rsync 命令封装进可执行脚本,再由 crontab 按周期调用。关键不在“能不能”,而在路径、权限、环境和日志是否闭环——漏掉任一环,任务就可能静默失败。
写一个带校验和清理的 rsync 备份脚本
脚本要独立可靠,不能依赖交互或当前 shell 环境。建议保存为 /usr/local/bin/backup-sync.sh:
- 开头声明解释器与 PATH:# !/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin - 定义变量(全部用绝对路径):
SOURCE="/var/www/html"
DEST="/backup/www-$(date +\%Y\%m\%d)"
LOG="/var/log/backup-sync.log" - 同步前检查源目录是否存在,目标父目录是否可写;同步后用 rsync --dry-run 验证差异,再用 find … -mtime +30 -delete 清理 30 天前的旧备份目录
- 最后加一句日志记录:echo "$(date): Sync done → $DEST" >> "$LOG"
给脚本加执行权限并手动测试
权限不对,crontab 执行时直接报 “Permission denied”。运行这两步确认基础可用:
- chmod +x /usr/local/bin/backup-sync.sh
- sudo -u youruser /usr/local/bin/backup-sync.sh(模拟 cron 用户身份运行)
- 检查 /backup 下是否生成新目录,/var/log/backup-sync.log 是否有时间戳记录,DEST 内容是否与源一致
用 crontab 添加定时任务
不要用 root 的 crontab 直接跑,除非必须。普通用户即可,更安全也更易排查:
- 运行 crontab -e,添加一行(例如每天凌晨 2:15 同步):
15 2 * * * /usr/local/bin/backup-sync.sh >> /var/log/backup-sync.log 2>&1 - 注意:crontab 中 不继承你的 ~/.bashrc,所以所有命令(如 rsync、date)必须确保在 PATH 覆盖范围内,或写全路径(/usr/bin/rsync)
- 保存退出后,用 crontab -l 确认已写入,再等几分钟观察日志是否有新条目
远程同步需提前配置免密 SSH
如果目标是另一台服务器(如 user@192.168.1.100:/backup/remote),必须让本地用户能无密码登录远端:
- 在本地运行 ssh-keygen -t ed25519(一路回车)
- 执行 ssh-copy-id user@192.168.1.100,输入一次密码完成公钥部署
- 测试:ssh user@192.168.1.100 'ls /backup' —— 不输密码即成功
- 脚本中 rsync 命令改为:rsync -avz --delete "$SOURCE/" "user@192.168.1.100:$DEST/"











