![为什么我没有看到使用 ls 立即复制文件?](https://linux22.com/image/50486/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E6%B2%A1%E6%9C%89%E7%9C%8B%E5%88%B0%E4%BD%BF%E7%94%A8%20ls%20%E7%AB%8B%E5%8D%B3%E5%A4%8D%E5%88%B6%E6%96%87%E4%BB%B6%EF%BC%9F.png)
是不是内存缓冲的原因?我这样做了cp /network/large_file . &
,并且一直ls -lh
在监视进度,但文件直到大约 400MB 才出现。 Linux 2.6 内核、Bash 4、4GB 交换空间、16GB RAM。
答案1
这可能取决于您的底层文件系统、可能的 HDD 缓冲区、Raid 控制器缓冲区(如果您使用的是 raid)等。复制文件时,它首先在内存中启动流,通知磁盘有一个挂起的写入操作 - 磁盘会从那里处理它。写入已“完成”,但文件实际上仍在由磁盘写入,这是很常见的情况。有些文件系统可以防止这种“滞后”,例如 ZFS,我相信 BtrFS(这称为写入时复制)。其他文件系统会报告复制/写入操作已完成,但实际上并非如此 - 如果断电等,这可能会导致文件损坏。ZFS 和 BtrFS 不会向操作系统报告文件写入操作已完成,直到文件写入操作完成为止。已完全完成——防止出现这种情况。
要测试这一点,请尝试复制更大的内容 - 例如将您最喜欢的发行版的 DVD iso 从一个目录复制到另一个目录。命令行将很快返回到提示符,但是如果您立即键入sync
并发送命令,您会注意到它将挂起命令行,直到写入操作完全完成。 (如果您有磁盘活动指示灯,您还会注意到它们仍在闪烁)