Inotifywait 用于大目录

Posted

技术标签:

【中文标题】Inotifywait 用于大目录【英文标题】:Inotifywait for large directories 【发布时间】:2011-11-11 19:30:39 【问题描述】:

在 inotifywait 的 man 更改中声明如下

-r, --recursive 监视作为参数传递的任何目录的所有子目录。手表将递归设置为无限 深度。不遍历符号链接。新创建的 子目录也将被监视。

警告:如果您在观看根目录时使用此选项 一棵大树,可能需要很长时间,直到所有 inotify 手表 已建立,此时将不会收到事件。 此外,由于每个子目录都会建立一个 inotify watch,它 是可能的,最大金额 将达到每个用户的 inotify 手表数量。默认最大值为 8192;它可以通过写入来增加 /proc/sys/fs/inotify/max_user_watches。

我认为这意味着每次调用 inotifywait 时,大型目录都会有延迟。因此,像这样使用监控功能不断监控一个大目录

inotifywait -m /home/user/Documents

比手动遍历目录更有效(来自手册页中的示例)

while inotifywait /home/user/Documents; do
 #Do Something for each file change
done

作为 while 循环的每次迭代,您必须再次设置 inotifywait。但是使用第一个选项,我无法根据回报执行。理想情况下,我想要的是这样的回调函数

inotifywait -m --callback ./callback.sh /home/user/Documents

所以每次都会调用callback.sh,返回值为inotifywait。我将如何实现它?

【问题讨论】:

【参考方案1】:

你可以像这样管道它:

inotifywait -m /my/directory | while read LINE; do ./do_something.sh $LINE; done

请记住,对于某些操作,您会收到许多事件,每个事件都会触发脚本的启动。

您还可以使用 perl 或其他语言直接使用 API,这为您提供了极大的灵活性。

【讨论】:

我从未使用过 Perl。我注意到很多示例都使用 C,但我更喜欢尽可能使用 shell。 总有机会使用命令的-e 开关过滤事件,和/或使用do_something.sh grep $LINE 获取相关事件。

以上是关于Inotifywait 用于大目录的主要内容,如果未能解决你的问题,请参考以下文章

inotifywait监控多个目录

inotifywait命令

inotifywait实现文件监控

如何监视文件并在终端中打印出更改(使用 inotify)?

利用inotifywait监控主机文件和目录

正则表达式排除非 golang 文件不适用于 inotifywait