python os.path.exists()对于已存在的nfs装载目录文件失败
我基本上有一个网站的Web服务器,另一个只是存储文件。文件服务器通过挂载其目录之一连接到主服务器。该网站运行Django,因此我主要处理python。无论如何,我似乎遇到了一些问题,文件被报告为不存在,即使它们确实存在 基本上当我打电话的时候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,我知道它确实存在,因为我在日志文件中打印了时间戳,它精确地显
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(以及它的挂载点)是什么,以及您运行脚本的用户是什么。