我有一个小应用程序,它监视目录树中的特定类型文件名(* .monitored)。它计算匹配文件的数量,使用inotify监视添加或删除匹配文件的各种事件,并可轮询报告当前文件数,以及过去几年添加和删除文件的平均速率秒。目录树可以包含数十万个文件,因此我试图避免维护受监控文件列表。
如果我跑:
touch foo.monitored
我得到了IN_CREATE,并设置了num_files = 1
touch foo.ignored
我得到IN_CREATE,忽略它,并留下num_files = 1
mv foo.ignored foo.monitored
产生
我忽略了foo.ignored的IN_MOVED_FROM,所以num_files = 1
用于foo.monitored的IN_MOVED_TO我将其作为一个新文件,所以设置num_files = 2,但旧的foo.monitored已被覆盖,所以我的总数是错误的。
我无法找到一个表明旧foo.monitored消亡的事件 - 有没有办法在不保留庞大的文件名结构的情况下做我想做的事情?
谢谢!
答案 0 :(得分:0)
不,inotify对你没有帮助。在这种情况下,它不会发出删除事件。
也许妥协的解决方案是记录每个目录中有多少个受监控文件,然后每次收到模糊信号时只重新扫描一个目录?
然而,使用inotify监视目录树有更大的问题。您是否考虑过如果将包含数千个受监控文件的目录移入或移出树中会发生什么?即使在树中移动目录也是有问题的。
编辑:其他想法:
分别在每个文件上添加一个inotify监视。这可能不是一个好计划。
计数器只能在您阅读时准确无误;任何读取计数的调用者,然后期望与一个令人讨厌的竞争条件错误等待发生之后读取的内容相匹配。因此,可能只是接受计数器可能有点错误,并在你有机会时纠正它。
每5次移动事件后进行全面扫描。
移动事件发生后,等待30秒后再查看是否还有,然后才进行扫描。
将树分成几部分("桶和#34;),并记录每个部分的计数。这应该可以减少扫描开销。
记录每个受监控文件路径的哈希值。这可能比记录实际文件名更少的内存/麻烦。