任何 linux API 或工具都可以监视下面任何文件夹中的任何更改,例如/SharedRoot 还是我必须设置例如每个文件夹的inotify?
Posted
技术标签:
【中文标题】任何 linux API 或工具都可以监视下面任何文件夹中的任何更改,例如/SharedRoot 还是我必须设置例如每个文件夹的inotify?【英文标题】:Can any linux API or tool watch for any change in any folder below e.g. /SharedRoot or do I have to setup e.g. inotify for each folder? 【发布时间】:2010-05-11 02:18:06 【问题描述】:我有一个包含约 10 000 个子文件夹的文件夹。
任何 linux API 或工具都可以监视下面任何文件夹中的任何更改,例如/SharedRoot 还是我必须为每个文件夹设置 inotify? (即,如果我想为 10k+ 个文件夹执行此操作,我会松动)。我想是的,因为我已经看到了这种低效方法的例子,例如http://twistedmatrix.com/trac/browser/trunk/twisted/internet/inotify.py?rev=28866#L345
我的问题: 我需要将文件夹按时间排序,最近活动的“项目”位于顶部。
当文件更改时,该文件上方的每个文件夹都应更新其上次修改的时间戳以匹配该文件。延迟没问题。打开一个文件(通常是 MS Excel)并再次关闭,它的文件日期可以上下跳跃。出于这个原因,我需要等到文件关闭之后,然后将该文件的文件夹排队以进行检查,然后我才去寻找其文件夹中的最新文件,因为触发文件的文件日期可能已经通过 Excel 或类似程序回溯到其原始时间戳。此外,如果使用/创建来自同一文件夹的多个文件,缓冲该文件夹父级的时间戳以至少将一堆更新折叠成一个延迟更新是有意义的。
我正在寻找一个 linux 解决方案。我有一些可以在 Windows 服务器上运行的代码,大部分排队功能都在这里:http://github.com/sesam/FolderdateFollowsFiles/blob/master/FolderdateFollowsFiles/Follower.vb
可用的 API:s inotify 在windows 上的亲戚ReadDirectoryChangesW 可以监视一个文件夹及其整个子树;请参阅http://msdn.microsoft.com/en-us/library/aa365465(VS.85).aspx上的 bWatchSubtree
桑巴? 修补 samba 源代码是可能的,但也许已经有可用的钩子了?其他可能性,例如客户端(各种 Windows 版本)和监视文件活动以递归更新文件夹?
【问题讨论】:
【参考方案1】:是的,您需要使用 inotify,但是您不需要立即在每个节点上消耗手表。
过程(类似于 beagle 的做法)相当简单:
-
在根节点上建立监视。
从根节点开始进行广度优先(不是深度优先)搜索
按搜索顺序在目录上建立监视。
注意目录创建事件,继续添加。发生这种情况时重新排序您的列表。
广度优先搜索很重要,否则你可能会因为你开始的时间和根节点的客户端正在做什么而错过一些东西。
参见this question,其中还提到了this RFQ。我遇到了和你一样的问题。
本质上,一个线程继续监视目录创建事件,几乎在创建新目录的同时添加新的监视。其他东西可以根据需要或在 inotify 线程释放其锁定后对列表进行排序。
我尝试过上述的无锁版本,但......有问题......成功:)
【讨论】:
更新:它实际上是在具有 200MB 内存的 NAS 上的大约 12 000 个文件夹,因此在所有节点上设置监视,无论是完成广度优先还是只是懒惰地使用 watever 方法 -r(递归)命令inotifywatch 上的 line 选项,似乎不太可行。我真正需要的是一些提示如何攻击另一条路径,使用或将一些钩子放入 smbd @Simon B - 每个用户的默认最大观看次数为 8192,因此 12 甚至 15k 次观看并不少见。请记住,手表(及其路径)存储在 内核 空间中。这里真正关心的不是用户空间中可用的内存,而是 NAS 端 VFS 的性能影响。如果只看目录,那应该不会太糟糕。顺便说一句,我没看错,NAS 上有 200MB 的内存? 是的。我们使用的是“Netgear ReadyNAS Duo”,在四处逛逛时,我们并没有真正想到必须将整个文件夹结构保存在内存中……除此之外,在常规使用中,Duo 的真正瓶颈是 CPU 能力。 【参考方案2】:我看到您在 Samba 共享下运行这些树。也许您可以使用 ClamAV 病毒扫描 VFS 模块来获得灵感,看看它们是如何触发“关闭时扫描”的。
Samba Howto : Stackable VFS Modules
检查关闭文件的时间并修改通向它的目录路径应该非常简单,而不会产生与 inotify 等相关的任何性能/内存开销。
只是一个想法。
【讨论】:
谢谢。结果我需要一个 Samba VFS 插件或模块(.sa 文件),它通常位于 /usr/local/samba/lib/vfs 中,并且可能会在 smbd 重新启动时自动加载。 * 关于 VFS:vfsx.sourceforge.net * 关于安装 VFS 模块; openantivirus.cvs.sourceforge.net/viewvc/openantivirus/… *(一个 6-7 岁)samba VFS 插件的源代码:file-ext-map.cvs.sourceforge.net/file-ext-map * 我现在正在寻找 vscan-clamav 源代码,但是找不到在线可见的源代码。 祝你好运!当你把它拉下来时,我喜欢阅读一篇关于它的博客文章。以上是关于任何 linux API 或工具都可以监视下面任何文件夹中的任何更改,例如/SharedRoot 还是我必须设置例如每个文件夹的inotify?的主要内容,如果未能解决你的问题,请参考以下文章
监视 Microsoft 翻译 API 的特定语言 API 调用