Vagrant,共享文件夹:利用NFS上的inotify

13

我们的Symfony2 Web应用程序在开发模式下使用Assetic watcher实时重新编译资产。

该Web应用程序在Docker容器中运行,在Vagrant VM(Ubuntu 12.04 Precise)中运行。主机是OSX 10.9 Mavericks,它通过NFS(v3)共享将代码文件夹与VM共享,并且代码通过Docker中的主机/客户端卷挂载到容器中。

由于inotify似乎无法检测NFSv3上的文件修改,因此监视器以轮询模式工作,这可能非常缓慢(~1/2分钟来检测更改)。

我已经阅读过NFSv4符合inotify标准,但我没有找到任何好的资料。

有没有办法使NFS/inotify一起工作?

3个回答

8
很抱歉,inotify无法在NFS上工作。inotify通过钩取内核中的VFS(虚拟文件系统)层来实现工作。每当发生修改时,inotify都会知道,因为修改发生在同一台机器上,因此在同一个内核中——这就使整个过程成为可能。
对于NFS,修改发生在服务器上,而通知则期望在客户端上。但是,当进行更改时,NFS不会通知客户端。否则,它就无法扩展。 NFS被设计(和操作)为在单个服务器上有数千个客户端。想象一下,如果您进行了微小的更改,服务器必须将其推送到所有客户端!
当然,您可以说“嘿,在NFS协议中应该有订阅机制,以便客户端可以告诉服务器他们想要了解特定位置发生的更改”。好吧,NFS是30年前设计的,因此请原谅他们没有包括这个订阅/通知系统 :-)
我不熟悉Assetic,但也许您可以编写自定义脚本来手动监视更改,并在检测到更改时重新编译资产。只需遍历包含资产源的目录,使用关联数组跟踪每个文件的修改时间,并每次检测到新文件(或新的修改时间)时重新编译。完成!
另请参阅关于inotify和NFS的此其他SO问题

感谢您详细的回答。我们已经有了一个使用Assetic的轮询脚本,这也是我在最初的问题中提到的“观察者”,但它实际上非常慢(需要约1/2分钟才能检测到更改)。 - arnaud.breton

6

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接