rsync --progress 显示的是目标文件已实际写入的字节数、精确百分比、瞬时写入速率及剩余时间,基于内核缓冲区实时读取,非估算;输出如“ubuntu-22.04.iso 3.21g 67% 48.2mb/s 0:01:15 (xfer#1, to-chk=0/1)”,其中3.21g为已落盘大小,67%为真实完成度。

直接看 rsync --progress 输出,是最准、最实时的单文件进度来源;其他方法要么估算、要么滞后、要么需要额外安装。
rsync --progress 显示的是什么?
它不是“估算”,而是实时读取内核缓冲区中已写入目标文件的字节数,再结合文件总大小算出百分比。输出形如:
ubuntu-22.04.iso 3.21G 67% 48.2MB/s 0:01:15 (xfer#1, to-chk=0/1)
其中:
-
3.21G是当前已写入的目标文件大小(不是源文件读取量) -
67%是基于目标文件最终大小的精确百分比 -
48.2MB/s是瞬时写入速率,受磁盘 I/O 和缓存影响,非恒定 -
(xfer#1, to-chk=0/1)表示这是第 1 个传输项,共 1 个文件,已全部检查完毕
为什么不用 pv 或 dd + status=progress?
它们显示的“进度”本质不同,容易误判:
-
pv source_file > dest_file:只监控从源文件读取的字节,不反映目标磁盘实际落盘情况;若目标磁盘慢或有 sync 延迟,pv早早就显示 100%,但dest_file还没真正写完 -
dd if=src of=dst status=progress:依赖内核write()系统调用返回,同样不保证数据已刷盘;且dd默认不调用fsync(),断电可能丢最后几 MB - 两者都不支持保留权限、硬链接、ACL 等元数据,纯做“字节搬运”,和同步任务语义不符
已经跑着的 cp 进程,还能补看进度吗?
不能直接看到“百分比”,但可用 progress 工具做有限推断:
- 先装:
sudo apt install progress(Debian/Ubuntu)或sudo yum install procps-ng(RHEL/CentOS,自带pidstat) - 运行:
progress -m,它会扫描所有cp进程,读取/proc/PID/fd/下打开的文件描述符偏移量 - 输出类似:
cp: 2.1 GiB / 4.7 GiB (44%) — 32.1 MiB/s,这个百分比是根据lseek()返回的当前读位置除以源文件大小算的,不等于目标写入完成度 - 注意:如果源文件被并发修改,或目标路径在 NFS 上,这个值会不准甚至报错
真正要盯住“同步完成”的关键点是什么?
不是进度条走到 100%,而是 rsync 进程退出且返回码为 0。因为:
-
--progress只管传输,不管fsync()和元数据提交 - 加
--sync或--fuzzy不影响进度显示逻辑,但会影响最终一致性 - 如果目标是远程 SSH,还要确认 SSH 连接未中断、远端
rsync进程已 clean exit - 最保险的做法:任务结束后运行
cmp -b src_file dest_file或sha256sum src_file dest_file校验
进度数字本身只是参考,真正决定“同步完成”的,是进程是否干净退出、校验和是否一致、以及你对一致性的容忍边界在哪里——这点常被忽略,但恰恰是生产环境里最容易翻车的地方。











