2014-11-14 153 views
0

我有一个小应用程序,它监视特定类型文件名(* .monitored)的目录树。它计算匹配文件的数量,使用inotify监视各种事件以匹配正在添加或删除的文件,并且可以轮询报告当前文件的数量,以及过去几次文件添加和删除的平均速率秒。目录树可以包含数十万个文件,所以我试图避免维护一个受监控文件的列表。Linux inotify事件重写()覆盖

如果我运行:

touch foo.monitored 

我得到IN_CREATE,我设置NUM_FILES = 1

touch foo.ignored 

我得到IN_CREATE,忽略它,并留下NUM_FILES = 1

mv foo.ignored foo.monitored 

生成:

IN_MOVE D_FROM为foo.ignored,我忽略,所以num_files = 1

IN_MOVED_TO for foo.monitored我把它作为一个新文件,所以设置num_files = 2,但是旧的foo.monitored已被覆盖,所以我的总数是错误。

我找不到一个事件表明旧foo.monitored的消亡 - 有没有办法做我想要的,而没有维护一个庞大的文件名结构?

谢谢!

+0

投票结束的人应该发表评论。这看起来像一个相当明确的问题。 – 2014-11-14 20:03:27

回答

0

不,inotify不会帮你在这里。在这种情况下它不会发出删除事件。

也许一个折中的解决方案是记录每个目录中有多少个受监视的文件,然后每次获得模糊信号时都重新扫描一个目录?

但是,使用inotify来监视目录树存在更大的问题。你有没有考虑过如果一个包含数千个受监控文件的目录被移入或移出你的树会发生什么?即使在树中移动目录也是有问题的。


编辑:其他的想法:

  1. 添加对每个文件的inotify的手表,个别。这可能不是一个好计划。

  2. 一个计数器在您阅读时只能是准确的;任何读取计数并希望与之后读取的内容匹配的调用者都有一个令人讨厌的竞争条件错误等待发生。因此,只要接受该柜台可能有点不妥,并且在您有机会时纠正该问题,或许可以。

  3. 每5个移动事件完成一次全面扫描。

  4. 移动事件后,等待30秒,看看是否有更多,只有然后进行扫描。

  5. 将树分成多个部分(“桶”),并记录每个部分的计数。这应该可以减少扫描开销。

  6. 为每个受监视的文件路径记录散列。这可能比记录实际文件名更少的内存/麻烦。

+0

感谢 - 正如它发生的那样,我可以很容易地处理目录的进出,因为目录树定义得很好(如squid缓存,dir/0/0/0/files,dir/0/0/1/files。 ..),我可以做一个完整的重新扫描,如果其中一个目录被移入或移出,但如果我必须对每个IN_MOVED_TO进行全面扫描,我不妨使用inotify ... 你可以建议另一种方法? – 2014-11-27 12:16:01

+0

我想你可以在每个单独的文件上设置一个inotify监视器,但所有可能的做法是将文件名存储移动到其他位置(并且我不完全确定它会如何*然后执行)。 – ams 2014-11-27 12:24:21

+0

TBH,我会试图证明在某些情况下文件数量可能只是大致正确,并且每当您进行完全重新扫描时都要更正您的计数。你说统计数据只是几秒钟的活动,这种情况可能很少见,所以这可能足够好了?也许增加一个计数器,只要发生不明确的事情,然后触发重新扫描,当它达到某个阈值? – ams 2014-11-27 12:27:05