rsync无实时同步状态,仅靠执行结果和退出码判断:成功返回0,失败非0;验证需比对源目标目录或用--dry-run预览,配合summary行查看sent/received数据。

Linux 本身没有统一的“文件同步状态”概念,得先明确你用的是哪个同步工具——rsync、Syncthing、inotify+脚本,还是 systemd 驱动的定时同步?不同工具查法完全不同,硬套命令只会看到一堆无关输出。
rsync 同步后怎么确认是否成功
rsync 是一次性同步工具,不维护长期状态,所以它没有“实时同步状态”,只有执行结果和退出码:
-
rsync命令本身不记录历史,每次运行完就结束;想验证结果,得靠比对源和目标目录 - 加
--dry-run参数可预览将要传输的文件,避免误操作 - 成功执行后返回码是
0,非0表示出错(如权限拒绝、网络中断),需检查rsync输出末尾的 summary 行,重点关注sent/received/total size - 若配合
ssh远程同步,失败时常见错误是Connection refused或Permission denied (publickey),不是同步问题,而是连接问题
Syncthing 怎么看每个文件的同步进度
Syncthing 是持续同步服务,状态可视化强,但得进 Web UI 才能看清细节:
- 打开
http://localhost:8384,进对应Folder的详情页 → 点Errors或Need to Sync标签,能看到具体卡在哪一个文件(比如permission denied或file busy) - 在
Folders列表里,状态显示Syncing时,右侧数字如12/47表示“已同步 12 个,共 47 个待同步” - 注意:Syncthing 不报告“同步耗时”,只报文件数和字节数;如果某个文件长时间卡在
Queued,大概率是权限或磁盘满导致无法写入目标路径 - 日志里搜索
Failed或stale能快速定位失败原因,日志路径通常是~/.config/syncthing/logs/
用 inotifywait + rsync 自建同步时如何判断是否漏同步
这种组合没有内置状态追踪,靠日志和文件时间戳交叉验证最可靠:
- 脚本里务必加
set -e和rsync --delete-after,否则删文件可能不生效,看起来“同步了”其实没删干净 - 每次触发同步后,建议用
find $SOURCE_DIR -type f -newermt "1 minute ago" | wc -l查最近变更文件数,再对比日志里rsync实际传输的行数 - 不要依赖
inotifywait的-m模式“永远监听”——它可能丢事件(尤其高频率小文件),建议加--monitor并用systemd管理进程存活 - 如果发现某类文件(如
.tmp)总被跳过,检查rsync是否用了--exclude="*.tmp",这属于配置遗漏,不是状态异常
系统级文件变更监控:stat 和 inotify 的区别
想主动感知文件是否被改写,别直接查“同步状态”,先确认变更是否被系统捕获:
-
stat只能看单个文件的mtime(修改时间)、ctime(元数据变更时间),不能告诉你“是否已同步”,只能辅助判断“有没有变” -
inotifywait -m -e modify,attrib可监听目录,但仅通知事件,不保证后续同步一定发生;事件丢失时无任何提示 - 真正要查“同步是否完成”,必须结合下游工具行为:比如 Syncthing 写完文件会更新数据库记录,而
rsync没有持久化记录,只能靠人工校验或脚本打标记 - 别用
ls -l对比时间戳来判断同步完成——NFS 或远程挂载下mtime可能不同步,应优先比对sha256sum
复杂点在于:所谓“同步状态”其实是三层叠加的结果——文件是否变更、变更是否被捕获、捕获后是否成功传输并落地。每一层都可能断链,而 Linux 不提供跨层状态聚合视图。最容易被忽略的是中间环节:比如 inotify 监听到创建事件,但 rsync 因磁盘满失败,此时日志里只有 rsync 错误,inotify 却早已静默退出。











