Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 是否有一个时刻,一个文件;不';“不存在”;在重命名过程中?_Perl_Unix_Rename_Aix - Fatal编程技术网

Perl 是否有一个时刻,一个文件;不';“不存在”;在重命名过程中?

Perl 是否有一个时刻,一个文件;不';“不存在”;在重命名过程中?,perl,unix,rename,aix,Perl,Unix,Rename,Aix,我们有一个黑盒第三方Java程序,它从一个位置获取输入文件并生成PDF。每次输入时,它都会将一个清单文件放在相同的位置,这就需要我们以受控的方式输入该文件。清单(或.xen/.que)是否仍然存在?不要输入一个输入文件 我们得到了非常罕见的(成千上万个文件中的一个)feed脚本实例,它找不到任何东西,给一个文件提供信息,并且在清单被覆盖并且内容不匹配时产生错误。我写了一个perl脚本,它什么也不做,只把时间打印到十万分之一,把我们关心的目录中的任何东西都过滤掉,然后打印出来。下面您可以看到.xe

我们有一个黑盒第三方Java程序,它从一个位置获取输入文件并生成PDF。每次输入时,它都会将一个清单文件放在相同的位置,这就需要我们以受控的方式输入该文件。清单(或.xen/.que)是否仍然存在?不要输入一个输入文件

我们得到了非常罕见的(成千上万个文件中的一个)feed脚本实例,它找不到任何东西,给一个文件提供信息,并且在清单被覆盖并且内容不匹配时产生错误。我写了一个perl脚本,它什么也不做,只把时间打印到十万分之一,把我们关心的目录中的任何东西都过滤掉,然后打印出来。下面您可以看到.xen和.que文件,其中.xen是输入,.que是它的重命名版本以指示处理

那么,我的问题是:94.26493上的文件怎么可能缺失?操作系统在重命名文件时是否隐藏文件?当feed程序在那一刻查找文件时,我们遇到了问题,所以我计划的攻击是两次检查文件;希望速度足够慢,可以抓住重命名的任意一端。我还应该指出,一旦一行出现两个文件,feed程序就会在其中放入另一个文件。它与重命名之前的文件不同

1421417394.26392/gpfs/fsdd/projects/corrèu esch/corrèu esch.d.xen
1421417394.26416/gpfs/fsdd/projects/corrèu esch/corrèu esch.d.xen
1421417394.26442/gpfs/fsdd/projects/corrèu esch/corrèu esch.d.xen
1421417394.26468/gpfs/fsdd/projects/corrèu esch/corrèu 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èU esch/corrèU esch.d.xen/gpfs/fsdd/projects/corrèU esch/corrèU esch.d.xen.queèU 1421417394265
1421417394.27456/gpfs/fsdd/projects/corrèU esch/corrèU esch.d.xen/gpfs/fsdd/projects/corrèU esch/corrèU esch.d.xen.queèU 1421417394265
1421417394.27486/gpfs/fsdd/projects/corrèU esch/corrèU esch.d.xen/gpfs/fsdd/projects/corrèU esch/corrèU esch.d.xen.queèU 1421417394265
1421417394.27528/gpfs/fsdd/projects/corrèU esch/corrèU esch.d.xen/gpfs/fsdd/projects/corrèU esch/corrèU esch.d.xen.queèU 1421417394265
实际情况是,如果您将
a
重命名为
b
,并且
b
已经存在,那么在重命名过程中将不会出现
b
不存在的时间点。它将引用以前存在的
b
或以前称为
a
的新
b

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


您提出的在短时间内检查两次的解决方案可能是最简单的方法。

据我所知,因此我认为文件在重命名操作之前和之后都会“存在”。除非使用Windows文件操作,否则Windows文件操作通常不是原子操作,但由于这个问题被标记为“unix”,我猜这与此无关。正确,具体地说,您可以包括perl程序的相关部分吗?feeder脚本还是吐出当前存在的文件的脚本?我希望我是错的。我通读了你提供的文件,得出了相同的结论。感谢您的确认。如果它是相同的文件系统(相同的装入点),那么它是原子的。如果您正在跨越文件系统,那么我将假设两者都存在的时间长度是有限的,但这可能因系统和实现而异。此外,所有注释实际上都与rename系统调用有关,Java可能选择使用该系统调用,也可能不选择使用该系统调用。我在路径中也看到了“gpfs”,这是一个远程文件系统,因此我建议不要下任何赌注。:-)@pedz,
rename
不一定能跨文件系统工作(为不支持该功能的操作系统定义了一个
EXDEV
错误)。此外,担保从未说明
a
何时存在或何时不存在,只是
b
将始终存在。是的。对于重命名系统调用,这是正确的。但我认为用户实际上在使用Java。如果可以,AIX上的mv命令使用rename,但如果跨文件系统,则不使用rename。除此之外,他实际上是在一个远程文件系统上做这项工作的,所以实际上是gpfs定义了它的工作原理。我提到的blackbox程序是Java,所以我不能保证它是如何进行重命名的。一个简单的旧名字只是我最好的猜测。关于gpfs也是远程文件系统的说法是正确的。我没有想到重命名逻辑会在那里决定。