问题 在重命名期间是否存在文件“不存在”的时刻?


我们有一个黑盒第三方Java程序,它从一个位置获取输入文件并制作PDF。它每次为每个输入放置一个清单文件在同一位置,这需要我们以受控方式提供文件。清单(或.xen / .que)是否仍然存在?不要输入输入文件。

我们的Feed脚本非常罕见(成千上万个文件中的一个)实例没有找到任何内容,提供文件,以及当清单被覆盖且事情不匹配时产生的错误。我编写了一个perl脚本,除了将时间打印到百万分之一,在我们关心的目录中输入任何内容,然后打印它。下面你可以看到.xen和.que文件,其中.xen是输入,而.que是它的重命名版本,用于指示处理。

我的问题是:如何在94.26493缺少文件?操作系统在重命名时是否隐藏文件?当Feed程序在那一刻查找文件时我们遇到了问题所以我计划的hack是两次检查文件;希望足够慢以捕获重命名的任何一端。我还应该指出,一旦有2个文件显示在一行上,那就是feed程序放入另一个文件的位置。它与重命名之前的文件不同。

1421417394.26392/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen
1421417394.26416/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen
1421417394.26442/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen
1421417394.26468/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen
1421417394.26493
1421417394.26907/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen.que_142_1421417394265
1421417394.27426/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen /gpfs/fsdd/projects/corr_esch/corr_esch.d.xen.que_142_1421417394265
1421417394.27456/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen /gpfs/fsdd/projects/corr_esch/corr_esch.d.xen.que_142_1421417394265
1421417394.27486/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen /gpfs/fsdd/projects/corr_esch/corr_esch.d.xen.que_142_1421417394265
1421417394.27528/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen /gpfs/fsdd/projects/corr_esch/corr_esch.d.xen.que_142_1421417394265

5656
2018-01-16 15:06


起源

据我所知, 重命名是POSIX系统上的原子操作,所以我认为文件在重命名操作之前和之后都会“存在”。 Windows文件操作是 不 通常原子,除非 交易NTFS 使用,但由于这个问题被标记为“unix”,我猜这是不相关的。 - GoBusto
正确,特别是AIX - pete1450
你能包含perl程序的相关部分吗? - Ben Grimm
支线脚本或吐出当前存在的文件? - pete1450


答案:


实际上 在POSIX保证 如果你重命名是这样的 a 至 b 和 b 已经存在,重命名时没有时间点 b 不存在。它将指代以前存在的 b 或新的 b 以前称为 a

如果 b 尚不存在(在您的示例中似乎是这种情况),则保证不适用。有可能在某个时刻都没有 a 也不 b 存在(它取决于特定文件系统的工作方式)。这两者都有可能存在 a 和 b 存在(并引用同一文件)。

您提出的短暂延迟检查解决方案可能是最简单的方法。


9
2018-01-16 15:33



我希望我错了。我通读了你提供的文件并得出了同样的结论。谢谢你的确认。 - pete1450
如果它是相同的文件系统(相同的挂载点),则它是原子的。如果您正在跨越文件系统,那么我会假设两者都存在的时间长度,但在系统和实现之间可能会有所不同。此外,所有注释实际上都与重命名系统调用有关,Java可能会或可能不会选择使用它。而且我也在远程文件系统的路径中看到“gpfs”所以我建议所有的赌注都关闭。 :-) - pedz
@pedz, rename 不一定适用于文件系统(有一个 EXDEV 为不支持该操作系统的操作系统定义的错误。此外,保证从来没有说过何时 a 是或不存在,只有那样 b 将永远存在。 - cjm
是。对于重命名系统调用,这是真的。但我认为用户实际上在使用Java。如果可以,则AIX上的mv命令使用重命名,但如果是跨文件系统则不使用。而且,最重要的是,他实际上是在远程文件系统上执行此操作,所以实际上它将是定义其工作原理的gpfs。 - pedz
我提到的黑盒程序是Java,所以我不能保证它是如何重命名的。一个普通的重命名只是我最好的猜测。你也正确认为gpfs是远程文件系统。我没有想过在那里决定重命名逻辑。 - pete1450