Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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
Linux 检查新创建的文件时如何强制刷新NFS缓存?_Linux_Perl_Nfs - Fatal编程技术网

Linux 检查新创建的文件时如何强制刷新NFS缓存?

Linux 检查新创建的文件时如何强制刷新NFS缓存?,linux,perl,nfs,Linux,Perl,Nfs,在Linux NFS共享装载上创建文件时,客户机是Linux或mac机器。文件的存在与否是下一步操作的关键,但检查并不总是返回正确的结果: e、 g我正在用perl做这件事,但仍然不能很好地工作,尤其是在mac机器上 write_key_file(); # write a file that must be checked before proceeding 当文件确实存在时,以下检查不能始终返回true 问题-perl中的此命令在NFS系统中未返回正确的状态: if( -e $file){

在Linux NFS共享装载上创建文件时,客户机是Linux或mac机器。文件的存在与否是下一步操作的关键,但检查并不总是返回正确的结果:

e、 g我正在用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——写入函数的退出代码或返回代码

问题在于,并非所有的编写都在代码块的范围内。这只能解决部分问题

C—禁用特定文件或目录的NFS缓存以进行文件检查

我需要确定这是否可能,以及如何实现?若否,原因为何

我愿意接受所有可能的解决方案,没有解决方案或其他可能性。

此解决方案属于B类:写入功能的退出代码或返回代码

…只有
open()
fopen()
需要保证它们对特定文件具有一致的句柄以进行读写
stat
和朋友不需要检索新属性。因此,为了接近打开缓存一致性,只有
open()
fopen()
被视为“打开事件”,需要立即从服务器获取新属性


以下解决方案属于A类:NFS客户端设置 i、 e.如果您不希望缓存的文件/目录条目被提供给客户端,请禁用缓存。

设置共享缓存

如果NFS安装文件(其存在正在被检查)由同一个客户端上的另一个应用程序创建(可能使用另一个安装点到同一NFS导出),则考虑在客户端上使用单个共享NFS缓存。

使用
sharecache
选项在客户端上设置NFS装载

此选项确定在同时多次装载同一导出时如何共享客户端的数据缓存和属性缓存使用相同的缓存可减少客户端的内存需求,并在通过不同装载点访问同一远程文件时向应用程序提供相同的文件内容。


设置无缓存的NFS装载 禁用属性缓存

使用
noac
选项在客户端上装载NFS共享

或者,禁用正在提供的缓存目录属性

使用
acdirmin=0,acdirmax=0
将缓存超时设置为0(有效禁用缓存)


设置NFS装载以忽略查找缓存 使用
lookupcache=positive
lookupcache=none

(可用选项:
全部

尝试通过NFS装载访问目录项时,
如果服务器上存在请求的目录条目,则结果称为

如果请求的目录条目在服务器上不存在,则结果称为

如果未指定
lookupcache
选项,或者指定了
all
,则客户端将假定这两种类型的目录缓存项都有效,直到其父目录的缓存属性过期为止

如果指定了
pos
positive
,则客户机将假定正条目在其父目录的缓存属性过期之前有效,但总是在应用程序可以使用负条目之前重新验证它们

如果指定了
none
,则客户端将在应用程序可以使用这两种类型的目录缓存项之前重新验证它们。这允许快速检测由其他客户端创建或删除的文件,但可能会影响应用程序和服务器性能


参考文献:



. 尤其是“数据和元数据一致性”部分。

这是一件丑陋的事情。你到底想完成什么?很可能有更好的方法。NFS缓存通过设计来提高效率。非缓存文件系统IO是可以实现的,但速度比您想象的要慢得多。通常,答案是——试着用不同的方式来做。我的观点是,这可能是一个XY问题。最好的解决方法是后退一步,看看您试图实现的目标。您可能能够将
sysopen
O|RDWR | O|u CREAT | O|u EXCL
一起使用,以强制NFS缓存刷新-如果调用成功,则文件不存在(但并非所有NFS实现都正确处理O|u EXCL)。我在python中使用了这种技术(我在perl中为空)。看看我的答案,也许这值得一试:。他在父目录上执行了一个
opendir/closedir
。答案对我来说已经足够好了,我只需要检查一下写入函数的退出代码,如果退出代码够不着,我就按原样离开,等待系统更新。谢谢
$exit_code = write_key_file();