我有一个自动脚本,可以将数据文件从计算机上收集到的数据文件移动到中央 NFS 服务器上,以便进行更常规的访问。我最近发现大约 1% 的文件无法移动,mv 报告有关文件已存在的错误:
mv: cannot create regular file `/mnt/data/2015/20150410_004130.dat': File exists
问题是,直到之前,文件不存在,并且在 mv 尝试创建它之后,它存在,但大小为 0,权限为 0000,并且日期可以追溯到 1970 年代(每次发生这种情况时,确切的日期似乎都会稍微增加)。
我更新了我的脚本以mv
使用运行strace
,并且失败的情况看起来与成功的情况完全相同,直到实际失败发生:
- 尝试直接重命名。失败(跨设备链接无效)
- 取消链接目标。失败(没有这样的文件或目录)
- 可供阅读的开源文件
- 使用选项 O_WRONLY|O_CREAT|O_EXCL,perms 0600 打开目标文件。通常可以工作,偶尔会失败,声称“文件存在”
我相当有信心,没有其他任何东西应该尝试创建此文件,尽管还有另一个脚本在数据文件完成后正在处理数据文件(实际上将它们移动到另一台服务器)。
这种行为似乎是在我在 NFS 服务器上从 Ubuntu 10.04 更新到 Ubuntu 14.04 的同时开始的(客户端配置未更改)。