我在 Linux 上运行了一个进程,该进程会反复更新 NFS 文件系统上的文件。该进程将新数据写入临时文件(在同一 NFS 上),并调用rename()
系统调用以将实时文件替换为新版本。
我有第二个rsync
进程定期对文件进行快照。由于 NFS 缓存一致性问题,该rsync
命令有时会发现文件不可用并退出并显示错误rsync: read errors mapping "/path/to/my/dir/foo": Stale file handle (116)
。
我如何告诉 rsync 忽略此错误并且不返回非零退出代码?我可以将其包装起来,|| true
但我担心会错过其他重要错误。
笔记:
您可以通过在一台机器上的 NFS 目录中运行以下命令来重现此情况:while true; do date > foo.tmp; mv foo.tmp foo; done
并且该命令在另一台机器上的同一目录中:
while true; do rm -f bar; rsync --quiet foo bar; done
第二条命令偶尔会打印如下错误
rsync: read errors mapping "/path/to/my/dir/foo": Stale file handle (116)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1189) [sender=3.1.3]
此问题仅发生在 NFS 上,并且写入器和快照程序位于不同的机器上。在大多数本地文件系统实现中,读取器进程始终可以访问该文件,因为rename()
是原子的即使使用 NFS,如果您在同一台机器上运行上述两个命令,您永远不会看到错误,因为只涉及您的本地 NFS 缓存。