【发布时间】:2016-05-03 18:40:43
【问题描述】:
在 Linux NFS 共享挂载上创建文件时,客户端是 Linux 或 mac 机器。文件的存在与否是下一步做什么的关键,但检查并不总是返回正确的结果:
例如,我在 perl 中执行此操作,但仍然无法正常工作,尤其是在 mac 机器上
write_key_file(); # write a file that must be checked before proceeding
当文件确实存在时,以下检查并不总是返回 true
问题 - perl 中的这个命令在 NFS 系统中没有返回正确的状态:
if( -e $file){}
无意中听到的不起作用的解决方案:
sleep(5); # wait 5 seconds
system("ls -ltr"); # force to cache?
if(-e $file){}
我不打算像这样检查每个文件,但有几个关键位置对获取正确的文件状态很重要。
我们是否有更好的方法来强制刷新特定目录中特定文件的 nfs 缓存?谢谢。
我不确定这是一个 XY 问题,但有一些最薄弱的地方都可以解决。
A -- NFS 客户端设置
如果现阶段有解决方案,那就太好了!
B -- 编写函数的exit_code或返回码
$exit_code = write_key_file();
它的问题,并不是所有的写法都在代码块的范围之内。这只能解决部分问题。
C -- 禁用特定文件或目录的 NFS 缓存以进行文件检查
我需要确定这是否可行以及如何实现?如果没有,为什么?
我对所有可能的解决方案持开放态度,没有解决方案或其他可能性。
【问题讨论】:
-
这是一件丑陋的事情。你实际上想要完成什么?很可能有更好的方法。为提高效率而设计的 NFS 缓存。可以完成非缓存文件系统 IO,但它比您想象的要慢得多。通常,答案是 - 尝试以不同的方式进行。
-
我的意思是,这可能是一个 XY 问题。最好的解决方法是退后一步,看看你想要完成的事情
-
您可能能够使用
sysopen和O_RDWR|O_CREAT|O_EXCL来强制刷新 NFS 缓存 - 如果调用成功则文件不存在(但不是所有 NFS实现正确处理 O_EXCL)。我在 python 中使用了这种技术(我在 perl 中为 NULL)。请参阅我对stackoverflow.com/questions/29979624/…的回复 -
也许这值得一试:unix.stackexchange.com/a/207383。他在父目录上做了一个
opendir/closedir。