mkdir 给出不同的错误(权限被拒绝与文件存在),具体取决于最近是否访问过目录

mkdir 给出不同的错误(权限被拒绝与文件存在),具体取决于最近是否访问过目录

问题

首先,我登录到一个新工作站。

myAcct@ws5: mkdir /users/adminAcct/foo/parentDir/childDir
mkdir: cannot create directory ‘/users/adminAcct/foo/parentDir/childDir’: Permission denied

Permission denied即使 childDir 存在,也会发生错误。

如果我访问 childDir,此错误会发生变化。我可以在 iPython 中使用os.path.isdir()或在 shell 中使用 执行此操作ls

myAcct@ws5: ls /users/adminAcct/foo/parentDir/childDir
file.cfg
myAcct@ws5: mkdir /users/adminAcct/foo/parentDir/childDir
mkdir: cannot create directory ‘/users/adminAcct/foo/parentDir/childDir’: File exists

我希望能够始终返回“文件存在”错误。

背景

--x对父目录具有组权限/users/adminAcct/foo/parentDir。子目录/users/adminAcct/foo/parentDir/childDir存在,并且我 r-x对该目录具有组权限。这最初是 python 中的一个问题,但我能够在 shell 中重新创建它。我正在使用 CentOS 6 工作站,这些工作站是集群的一部分,通过 NFS 安装主目录。该/users目录位于/etc/fstab,并使用选项安装(rw,vers=3,hard,intr,addr=<some IP addr>)。内核是Linux ws5.MyCompany.com 2.6.32-431.17.1.el6.x86_64 #1 SMP Wed May 7 23:32:49 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

语境

在我访问子目录后的一段时间内,mkdir 将继续返回File exists错误。一段时间后,mkdir 将再次返回Permission denied错误。这会在这些工作站上使用/users/adminAcct/foo/parentDir/childDiras启动和运行气流 CeleryExecutor 工作程序时产生间歇性问题AIRFLOW_HOME。我无法预测这些问题何时会再次出现。

答案1

NFS 客户端缓存属性,这些属性具有基于挂钟的超时。

这提高了性能,但在某些情况下会给出“稍微不正确”的结果。客户端工作方式的本质并不总能满足有关文件存在等的标准 UNIX 保证。

缓解此问题的一种方法是禁用客户端缓存 ( noac),或仅禁用目录条目缓存 ( lookupcache=none) - 请参阅https://linux.die.net/man/5/nfs

相关内容