我基本上有一个网站的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子进程,在远程目录中生成一个文件。当请求被发出时,它启动子进程并返回文件的预期位置。
在前端,有一个url被ping,它调用os.path.exists()来检查该文件是否存在,当存在时,资源就通过ajax加载。
疑似问题是有时这个pinger会报告文件在实际存在几秒钟后仍不可用。这也是我认为可能是过时缓存的可能问题的原因。
所有的文件和它们所在的目录都是所有者/组www-data,任何由django实例化的子进程也是如此。而且,这个问题似乎并不完全可重复。有时它会比预期快,而有时它会比预期慢几秒钟。
os.path
应该是透明的。一旦挂载完成,它应该表现出相同的行为。 - Hyperboreus