能稳定运行rsync同步的关键在于参数正确、路径准确、环境稳定;需先配置免密SSH(专用用户生成密钥、规范部署公钥、严格权限控制、显式测试),再用-a-z--delete-after等参数安全拉取,配合脚本封装、cron定时、日志记录与轻量校验。

直接用 rsync 做同步、cron 控制时间,就能稳定跑起来——关键不在“能不能”,而在参数写对、路径写准、环境配稳。
先配好免密 SSH,这是自动化的前提
没有它,每次同步都要输密码,cron 就彻底失效。不是简单 ssh-copy-id 就完事,得规范操作:
- 在执行同步的服务器上,用专用用户(比如 backup)生成密钥:ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_backup
- 把公钥内容(cat ~/.ssh/id_rsa_backup.pub)追加到目标服务器对应用户的 ~/.ssh/authorized_keys 里,只加一行,别覆盖
- 两边都检查权限:~/.ssh 必须是 700,authorized_keys 和私钥文件必须是 600
- 测试命令:ssh -i ~/.ssh/id_rsa_backup -o ConnectTimeout=5 user@ip "date",能秒回时间才算通
rsync 命令要带核心参数,不乱删、不丢属性
推荐拉取模式(本地同步远程数据),更安全可控:
- -a:保留权限、时间戳、软链接等,备份一致性基础
- -z:跨网络时压缩传输,省带宽
- --delete:仅在确认源和目标应完全一致时启用;若需保留历史或防误删,改用 --delete-after 或干脆不用
- -e "ssh -i /path/to/key":显式指定密钥路径,避免 cron 环境找不到
- 路径末尾斜杠决定语义:/src/ 同步内容,/src 同步目录本身——错一个字符,结构就偏了
用脚本封装 + cron 定时,才真正可维护
别把 rsync 命令直接塞进 crontab,容易出错还难调试:
- 写脚本,比如 /usr/local/bin/sync-docs.sh,开头加环境和锁:
. /etc/profile
if [ -f /tmp/sync.lock ]; then exit 0; fi
touch /tmp/sync.lock
trap 'rm -f /tmp/sync.lock' EXIT
- 脚本里用绝对路径调用 rsync:/usr/bin/rsync -a --delete -e "ssh -i /home/backup/.ssh/id_rsa_backup" user@192.168.1.100:/data/docs/ /backup/docs/
- 加日志:>> /var/log/sync-docs.log 2>&1
- 编辑定时任务:crontab -e,加一行(例如每天凌晨 2:15 执行):15 2 * * * /usr/local/bin/sync-docs.sh
加点轻量校验,问题早发现
同步完成不等于数据可靠,几行代码就能提升可信度:
- 备份前后分别统计文件数:find /src -type f | wc -l 和 find /dest -type f | wc -l,记入日志比对
- 随机抽 3–5 个文件做哈希比对:sha256sum /src/file.txt vs sha256sum /dest/file.txt
- 加 --checksum 参数强制按内容比对(适合关键数据),但会略慢,权衡使用


















