inotify为啥无法检视共享文件夹

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了inotify为啥无法检视共享文件夹相关的知识,希望对你有一定的参考价值。

参考技术A #!/bin/bash
/usr/bin/inotifywait -mrq -e create,delete,modify,move /zqy | while
read line; do
mkdir /ooo
done
上面的就是脚本文件,比较简单的脚本,如果直接手动运行都是正常的,就是加入到rc.local后开机无法启动,用了&,也没用。比较奇怪的是直接手动运行就可以
不过这个脚本运行后,本来下方的命令行输入就不见了,不可输入任何东西(但是对zqy目录进行操作时会相应的显示操作记录),我在想是不是因为这个原因导致的?有大神来帮帮吗?
1 inotify_add_watch()实现了监控本地目录文件,但是对于从别的服务器映射过来的共享文件夹,无法监控到文件夹内的变化,有什么好的解决方案?(如果就是用监控方式的话)。
2 文件增量的方式比监控复杂。

【总结】一开始时,就在csdn下载了“linux下监控文件夹内变化”这一程序,里面就有通过通信方式监控对方文件夹,迫于无奈,最终还是使用了通信的方式。程序总要有结案的一天,没有人回答,只能选这个为最佳答案了,老夫是不吝啬分的,并非垂钓之人。

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

【中文标题】Vagrant,共享文件夹:利用 inotify over NFS【英文标题】:Vagrant, shared folder: take advantage of inotify over NFS 【发布时间】:2014-02-07 01:26:26 【问题描述】:

我们的 Symfony2 webapp 在开发模式下使用 Assetic watcher 随时重新编译资产。

webapp 在 Docker 容器中运行,该容器在 Vagrant VM(Ubuntu 12.04 Precise)中运行。 主机是 OSX 10.9 Mavericks,它通过 NFS (v3) 共享与 VM 共享代码文件夹,并且代码通过 Docker 中的主机/访客卷安装在容器中。

由于 inotify 似乎无法检测 NFSv3 上的文件修改,因此观察程序在轮询模式下工作,这可能非常慢(检测修改大约需要 1/2 分钟)。

我读到 NFSv4 符合 inotify,但我没有找到任何好的资源。

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

【问题讨论】:

【参考方案1】:

这是一个旨在解决此问题的插件:https://github.com/mhallin/vagrant-notify-forwarder

只需安装它并重新加载您的盒子即可将 inotify 通知转发到您的访客机器:

vagrant plugin install vagrant-notify-forwarder

【讨论】:

【参考方案2】:

您可能对这个名为 Guard 的工具感兴趣,它会侦听主机操作系统上所做的文件更改,然后在 Guest 上拉取并更新这些更改。这对我有用,现在我的资产几乎可以立即更新。

https://serverfault.com/questions/453826/vagrant-shared-folder-and-file-change-events

【讨论】:

【参考方案3】:

很遗憾,inotify 不能在 NFS 上工作。 inotify 通过将自身挂接到内核中的 VFS(虚拟文件系统)层来工作。每当发生修改时,inotify 都会知道,因为修改发生在同一台机器上,因此发生在同一个内核中——这使得整个事情成为可能。

使用 NFS,修改发生在服务器上,而通知预计会出现在客户端上。但是 NFS 不会在进行更改时通知客户端。否则,它不会扩展。 NFS 的设计(和操作)在单个服务器上拥有数千个客户端。想象一下,如果您做了一个微小的更改,服务器必须将其推送给所有客户端!

当然,您可以说“嘿,NFS 协议中应该有订阅机制,以便客户端可以告诉服务器他们想知道特定位置发生的变化”。嗯,NFS 是 30 年前设计的,所以请原谅他们没有包括这个订阅/通知系统 :-)

我不熟悉 Assetic,但也许您可以使用自定义脚本手动监视更改,并在每次检测到更改时重新编译资产。只需遍历包含资产源的目录,跟踪关联数组中每个文件的 mtime,每次检测到新文件(或新 mtime)时,重新编译。轰隆隆!

另见this other SO question about inotify and NFS。

【讨论】:

感谢您的详细解答。我们已经有了一个带有 Assetic 的轮询脚本,我在最初的问题中提到它是“观察者”,但它实际上非常慢(大约 1/2 分钟来检测变化)。

以上是关于inotify为啥无法检视共享文件夹的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 boot2docker 从主机共享代码目录不会在来宾上调用 inotify

文件共享之ftpnfssamba和inotify_rsync实时备份

虚拟机VMVirtualBox和宿主机可以ping通,但是虚拟机无法访问宿主机电脑共享文件,为啥?

为啥我的电脑里有一个文件夹无法访问,且大小为0,而且无法删除?

局域网访问共享速度慢?同样的访问同一台局域网服务器,别的电脑很快.这个为啥?