Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.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
python os.path.exists()对于已存在的nfs装载目录文件失败_Python_Linux_Django_Ubuntu 12.04_Nfs - Fatal编程技术网

python os.path.exists()对于已存在的nfs装载目录文件失败

python os.path.exists()对于已存在的nfs装载目录文件失败,python,linux,django,ubuntu-12.04,nfs,Python,Linux,Django,Ubuntu 12.04,Nfs,我基本上有一个网站的Web服务器,另一个只是存储文件。文件服务器通过挂载其目录之一连接到主服务器。该网站运行Django,因此我主要处理python。无论如何,我似乎遇到了一些问题,文件被报告为不存在,即使它们确实存在 基本上当我打电话的时候 filepath = '/path/to/file/on/nfs/share' exists = os.path.exists(filepath) 即使文件实际存在,exists也为false,我知道它确实存在,因为我在日志文件中打印了时间戳,它精确地显

我基本上有一个网站的Web服务器,另一个只是存储文件。文件服务器通过挂载其目录之一连接到主服务器。该网站运行Django,因此我主要处理python。无论如何,我似乎遇到了一些问题,文件被报告为不存在,即使它们确实存在

基本上当我打电话的时候

filepath = '/path/to/file/on/nfs/share'
exists = os.path.exists(filepath)
即使文件实际存在,exists也为false,我知道它确实存在,因为我在日志文件中打印了时间戳,它精确地显示了文件创建的时间。我不确定问题出在哪里,但我知道os.path.exists的文档是这么说的

在某些平台上,如果未授予对请求文件执行os.stat()的权限,则此函数可能返回False,即使路径实际存在

我知道情况并非如此,因为两个文件共享相同的组和组号,这两个服务器上也共享相同的组号。它可能是一个过时的缓存或类似的东西吗

我的安装是通过fstab自动完成的

Client side, the settings are:
filehost:/filefolder /localfolder nfs defaults,rsize=32768,wsize=32768

Server side, the settings are:
/filefolder webserver(rw,sync,no_root_squash,no_subtree_check)
编辑:

因此,我想了解更多信息/细节。我正在运行一个Python子进程,它在远程目录中生成一个文件。当发出请求时,它启动子流程并返回文件的预期位置

在前端,有一个被ping的url,它在那里调用该文件的os.path.exists(),当它这样做时,资源就会通过ajax加载

可疑的问题是,有时这个pinger会报告文件在实际可用后几秒钟内不可用。这也是我认为过时缓存可能存在问题的原因


所有文件和其中的目录都是所有者/组www数据,以及django实例化的任何子流程。此外,这个问题似乎不完全可重复。有时它工作得很快,而另一些则比预期的时间长几秒钟

这是由于找到了NFS缓存:

属性缓存缓存struct stat中的所有内容,因此可以从缓存返回stat()和fstat()调用。如果需要查看文件的最新大小或mtime(或其他字段),则需要在调用stat()之前刷新文件的属性缓存

请注意,如果缓存了文件句柄,stat()将返回该缓存文件的信息(因此结果与fstat()相同)。如果需要使用给定的文件名stat()最新文件,请首先刷新文件句柄缓存

我认为它的
stat
失败是因为文件还没有在缓存中。 我在NFS手册页中找到了以下内容:

ac/noac-选择客户端是否可以缓存文件属性。如果两个选项都未指定(或指定了ac),则客户端将缓存文件属性。

但是那里也有一个警告,所以我只是忍受着延迟:

使用noac选项可以在访问相同文件的NFS客户机之间提供更高的缓存一致性,但会导致显著的性能损失。因此,鼓励明智地使用文件锁定。数据和元数据一致性部分详细讨论了这些权衡


+1因为我很好奇。实际上,无论文件系统是本地安装还是远程安装,都应该对操作系统路径透明。一旦挂载,它的行为应该是相同的。FWIW,我在一个nfs挂载目录上进行了测试,结果返回true。可能调用存在于/path/,/path/to/,/path/to/file/等上,以查看从何处开始返回False?Dan说了什么。最好知道共享目录上的perms和ownerships(以及它的挂载点)是什么,以及您运行脚本的用户是什么。