2011-11-11 36 views
0

在inotifywait手册改变陈述Inotifywait对于大型目录

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

警告:如果您在观看的 根目录中的大树下,使用此选项可能需要相当长一段时间,直到所有的inotify手表 建立和事件不会在这个时候接收。 此外,由于每个子目录将建立一个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返回值每次被调用。我将如何实现这一点?

回答

3

可以通过管道将它像:

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

请记住,你得到了某些操作的许多事件,其中的每一个将触发启动脚本的。

您也可以使用perl或其他语言直接使用API​​,这会给您带来很大的灵活性。

+0

我从来没有用过Perl。我注意到很多示例使用C,但我更喜欢尽可能使用shell。 – puk

+0

总是有机会使用命令的“-e”开关过滤事件,并且/或者让do_something.sh grep相关参数的'$ LINE'。 –