2012-01-02 66 views
25

如何监视整个目录树在Linux中的变化(ext3文件系统)?如何在Linux中监视完整的目录树以进行更改?

目前该目录包含约3000 子目录,在三个目录级别组织有关五十万文件

这些大部分都是小文件(< 1kb,几个可达100 kb)。这是一种队列,我需要知道何时创建,删除文件或在5-10秒内修改其内容。我知道有inotify和排序,但AFAIK他们只监视一个目录,这意味着我需要3,000 inotify句柄 - 在我的情况下 - 超过通常的1024个句柄允许一个进程。或者我错了?

如果Linux系统不能告诉我什么,我需要:也许有一个FUSE项目,模拟文件系统(复制所有文件真实文件系统上访问),并分别记录所有修改(不能罚款一个)?

回答

12

据我所知,除了在每个目录上递归设置inotify腕表外,没有别的办法。

也就是说,您不会用完文件描述符,因为inotify不必保留fd来观察文件或目录(其前身dnotify确实遭受此限制)。 inotify改为使用“观察描述符”。

根据inotifywatch的文档,默认限制是8192个观察描述符,您可以通过将新值写入/proc/sys/fs/inotify/max_user_watches来增加它。

+0

听起来不错。在使用这么多观看描述符时需要考虑的负面因素? – 2012-01-02 09:50:11

+0

不,除了创建所有手表所花费的时间之外,我不认为你会遇到只有3000个子目录的问题。 – 2012-01-02 09:52:25

3

是不是应该fanotify最终提供这种能力? 引用LWN

”fanotify有两个基本的'模式'指导和全球。 [...]全球fanotify指示 它希望系统上的所有内容,然后单独标记 它不关心的inode。

虽然我错过了最新的状态。

+1

根据对http://stackoverflow.com/a/1847268/130352的评论... fanotify进入2.6.36。 – 2012-01-03 09:02:52

28

我使用inotifywait工具来完成类似的事情:

#!/bin/bash 
while true; do 

inotifywait -e modify,create,delete -r /path/to/your/dir && \ 
<some command to execute when a file event is recorded> 

done 

这将建立递归目录手表对整个树,让你当有些变化执行命令。如果您只想查看更改,可以添加-m标志以将其置于监控模式。

+1

这比接受的答案更有帮助+1 – qed 2013-11-25 18:01:38

+2

为避免'while循环'使用'-m'或'--monitor'开关/选项/标志/ arg。不知道什么时候该“开关”应运而生,但比循环更好 – gwillie 2017-03-11 10:06:26

+0

您还应该添加'move'事件: 'inotifywait -e修改,创建,删除,移动-r/path/to/your/dir' – famzah 2017-07-18 09:19:41

3
$ inotifywait -m -r /path/to/your/directory 

这个命令是不够递归地看目录的所有活动,如访问,打开,创建,删除...

相关问题