处理多个文件时如何使inotify等待

Posted

技术标签:

【中文标题】处理多个文件时如何使inotify等待【英文标题】:How to make inotify wait when processing multiple files 【发布时间】:2010-07-27 17:42:28 【问题描述】:

我正在开发一个使用 jnotify 检查更改的目录同步程序。

这个想法是每当 jnotify 检测到更改时,就会执行同步。问题是,当一个目录中复制或修改许多文件时,会执行许多同步而不是一次大同步。

理想情况下,如果您要将 100 个大文件复制到目录 A,则在所有文件完全复制到目录 A 之前,不会同步到目录 B。

我曾想过以某种方式使用临时目录 (A1) 来保存文件,直到它们被完全复制,然后将它们移动到 A1。但是这个解决方案不能很好地工作,因为我使用 unison 来执行只发送文件增量的同步 - 这是我想使用而不是规避的功能。

也许有一种方法可以使用 i/jnotify 来检测多个文件何时被同时更新?

【问题讨论】:

【参考方案1】:

这里有一个建议。如何在您的应用程序上设置一个集合并让它收集“修改过的”文件/等,它将将该文件添加到一个集合中,当文件数量超过一定数量时,比如 100,然后您将进行同步.如果您希望它具有合理的响应性,那么设置一个计时器也是一个好主意,例如如果在 X 时间内没有新的更改/等被添加到集合中,请继续进行同步.

【讨论】:

感谢您的回复。到目前为止,我认为它可能会按如下方式工作,直到我找到更好的解决方案......每当发生一个动作(即 - CREATE)时,让一个侦听器线程等待最多 1 秒,看看是否检测到另一个动作。如果未检测到任何操作,则执行同步。然后,一旦启动同步,就推迟对同步的进一步调用,直到当前同步完成。如果要同步文件,请在第一个同步之后执行另一个同步。这将强制同步成批的小文件组。或者一次同步一个大文件。这似乎有点合理。 @Jono - 这似乎是合理的,我个人会延迟更长的时间,但总体思路似乎是合理的,它需要一些工作来实现,但它是可行的。您将如何处理对文件的更改? (直接复制,或类似 rsync) 不确定处理文件更改是什么意思。我将在整个目录上使用 inotify 来检查其中的任何更改。 我的意思是,您将如何复制更改的文件/目录?也就是每次都使用 rsync 还是常规复制? 啊。我打算使用统一。我需要两种方式同步。我更喜欢用 Java 编写的可以更好地与我的代码集成的东西,但它似乎是完成这项工作的最佳工具。

以上是关于处理多个文件时如何使inotify等待的主要内容,如果未能解决你的问题,请参考以下文章

实时备份工具之inotify+rsync

CentOS7 inotify-tools+lftp 实现文件实时同步

异步读取 inotify 描述符失败

如何在c中使用inotify查看具有多个文件更改的目录

linux,inotify - 如何订阅?

Inotify 等待复制脚本损坏图像