rsync配合cron可实现高效定时备份,关键在于末尾斜杠控制同步粒度、-n模拟验证、绝对路径避免path问题、--delete启用前必须dry-run、远程统一走ssh免密传输。

直接用 rsync 配合 cron 就能跑起来,不需要额外服务或复杂配置。关键不是“能不能做”,而是“怎么避免同步错、删错、漏传、权限丢、路径崩”。
rsync 命令必须加末尾斜杠才能同步内容
这是最常踩的坑:不加斜杠会把整个目录连同名字一起复制过去,加了才只同步里面的东西。
-
/data/→ 同步/data目录下的所有文件和子目录 -
/data(无斜杠)→ 把/data这个目录本身作为子项,复制到目标路径下,结果变成/backup/data/... - 远程同步时同样适用:
user@host:/path/to/dir/和user@host:/path/to/dir行为完全不同 - 建议统一写成带斜杠形式,再配合
-n先 dry-run 确认输出是否符合预期
cron 执行时 PATH 很窄,脚本里必须用绝对路径
cron 启动的 shell 环境几乎不加载 /etc/profile 或用户 ~/.bashrc,rsync、ssh、date 等命令可能根本找不到。
- 在脚本开头显式声明:
PATH=/usr/bin:/bin:/usr/local/bin - 或者所有命令都写绝对路径:
/usr/bin/rsync、/usr/bin/ssh - 远程同步依赖
ssh,确保/usr/bin/ssh存在且可用(可通过which ssh查) - 别信“我手动运行没问题”,
cron是另一个世界
首次启用 --delete 前一定要先 -n 模拟执行
--delete 会让目标目录严格镜像源目录——源里删了的文件,目标里也会被删掉。一旦配错路径或方向,rsync 会直接清空你备份目录。
- 先加
-n(dry-run)跑一次:rsync -avn --delete /src/ /dst/ - 检查输出里是不是只列出了你预期要删/传的文件,尤其注意 “deleting” 行是否出现在正确位置
- 确认无误后,再删掉
-n正式执行 - 如果不确定,可先去掉
--delete,等跑几天观察一致性后再加
远程同步必须走 SSH,别开 rsync daemon
生产环境不要暴露 rsync 的 873 端口,SSH 已经足够安全且免配置。
- 命令格式:
rsync -avz -e "ssh -p 2222" /local/ user@remote:/remote/ - 确保已配置好免密登录:
ssh-keygen+ssh-copy-id或手动部署authorized_keys -
-z开启压缩,对跨公网传输更友好;内网可省略 - 如果远程主机 SSH 端口不是 22,必须用
-e "ssh -p XXX"显式指定,rsync不会自动读取~/.ssh/config
真正麻烦的从来不是写那行 cron 表达式,而是路径多一层、斜杠少一个、PATH 漏一点、--delete 忘加 -n —— 这些地方出错,轻则同步失败,重则数据覆写。动手前,先 rsync -avn 看一眼输出,比什么都靠谱。











