rsync + cron 定时同步必须配对使用:rsync 命令需能独立成功执行,cron 必须以正确用户身份、完整 path 环境和足权脚本调用它;常见失败源于 cron 极简 shell 不加载用户配置、ssh 代理失效,故须用绝对路径(如 /usr/bin/rsync)、显式声明 path、重定向日志,并确保 ssh 免密用户与 cron 执行用户一致。

rsync + cron 定时同步必须配对使用
定时同步不是“装完 rsync 就能跑”,它依赖两个明确环节:rsync 命令本身能成功执行,且 cron 能以正确用户身份、环境变量和权限调用它。常见失败是脚本在终端能跑,但 cron 里静默失败——根本原因是 cron 的 SHELL 环境极简,不加载 ~/.bashrc,SSH 密钥代理也不生效。
- 同步命令必须显式指定完整路径:
/usr/bin/rsync,不能只写rsync - cron 执行用户必须和 SSH 免密配置用户一致;若用 root 运行 cron,就得用 root 生成密钥并
ssh-copy-id到目标机 - 脚本开头加环境声明:
#!/bin/bash+export PATH="/usr/local/bin:/usr/bin:/bin" - 日志重定向必不可少:
/usr/bin/rsync -avz /src/ user@host:/dst/ >> /var/log/rsync.log 2>&1,否则错误全丢进黑洞
inotifywait 触发同步时要注意事件风暴
inotify 监控单个文件修改会触发多个事件(如 MODIFY、ATTRIB、CLOSE_WRITE),尤其编辑器保存时可能连发 3–5 次。直接每次事件都调 rsync,会导致重复传输、目标端文件被覆盖多次,甚至 rsync 进程堆积。
- 用
inotifywait -m -e close_write,move,create,delete --format '%w%f' /path监听,但必须配合去重逻辑 - 推荐加简单防抖:收到事件后
sleep 0.5,再检查文件是否还在(避免临时文件干扰) - 不要监听整个大目录树(如
/var/log),优先锁定具体子目录,否则 inotify 句柄耗尽会报No space left on device - 务必设超时退出:
inotifywait ... || exit 1,否则进程挂掉后监控就停了
lsyncd 配置里 target 写法决定协议走向
target 字段不是地址填空题,它直接控制底层走哪条链路。填错格式不会报错,而是静默降级或连接拒绝,排查极其困难。
-
target = "user@192.168.1.100:/data/"→ 走 rsync over SSH,依赖 ssh 免密,最常用也最稳 -
target = "192.168.1.100::backup"→ 走 rsync daemon 模式,目标机必须运行rsyncd且/etc/rsyncd.conf开放[backup]模块,新手极易漏配secrets file权限(必须600) - 末尾斜杠不能省:
/data/同步目录内容,/data同步整个data目录(即目标端会多一层data文件夹) - 非标准 SSH 端口必须双写:
ssh = { port = 2222 }+rsync = { _extra = {"--rsh=ssh -p 2222"} },缺一不可
时间同步别混用 ntpd 和 systemd-timesyncd
CentOS 7/8 和 Ubuntu 16.04+ 默认启用 systemd-timesyncd,而老教程教的 ntpd 与之冲突。两者同时开会导致时间跳变、服务异常,且 ntpd 在新版 systemd 中默认被 masked。
- 先查当前服务:
timedatectl status,看 “NTP enabled” 和 “NTP service” 字段 - 若显示
systemd-timesyncd,就改它的配置:/etc/systemd/timesyncd.conf,取消注释并改NTP=ntp.aliyun.com - 若坚持用
ntpd,必须先停用 timesyncd:sudo systemctl stop systemd-timesyncd && sudo systemctl disable systemd-timesyncd -
ntpdate是一次性命令,不能替代服务;写进 cron 会和后台服务抢锁,报错the NTP socket is in use
lsyncd 日志目录没提前 chown lsyncd:lsyncd,它就默默不写日志;又比如 inotifywait 脚本后台运行却没用 nohup 或 systemd 管理,终端一关进程就死。这些细节不验证,同步永远在“看起来配好了”的假象里。











