如何监视整个目录树以查找Linux(ext3文件系统)中的更改?
目前,该目录在大约3,000个子目录中包含大约五十万个文件,以三个目录级别组织。
这些大多是小文件(<1kb,少数高达100 kb)。这是一种队列,我需要知道何时创建,删除文件或在发生的5-10秒内修改其内容。
我知道有inotify和排序,但AFAIK他们只监视一个目录,这意味着在我的情况下我需要3,000个inotify句柄 - 比单个进程允许的通常1024个句柄更多。还是我错了?
如果Linux系统无法告诉我我需要什么:也许有一个FUSE项目模拟文件系统(复制真实文件系统上的所有文件访问)并单独记录所有修改(不能很好)?
据我所知,除了在每个目录上递归设置inotify
手表之外别无他法。
也就是说,你不会用完文件描述符,因为inotify
不必保留fd来观察文件或目录(它的前身,dnotify
,确实受到这种限制)。 inotify
使用“手表描述符”代替。
根据inotifywatch的文档,默认限制是8192个监视描述符,您可以通过将新值写入/proc/sys/fs/inotify/max_user_watches
来增加它。
我使用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
标志以将其置于监控模式。
$ inotifywait -m -r /path/to/your/directory
此命令足以以递归方式查看所有事件的目录,例如访问,打开,创建,删除......
是不是应该最终提供这种能力?引用LWN:
“fanotify有两个基本'模式'指导和全球。 [...] fanotify global表示它想要系统上的所有内容,然后单独标记它不关心的inode。“
但是我忘记了它的最新状态。
使用来自inotify-tools的inotifywait:
sudo apt install inotify-tools
现在创建一个包含隐藏文件和文件夹的脚本myscript.sh
:
#!/bin/bash
while true; do
inotifywait -e modify,create,delete,move -r $1
done
使用chmod +x myscript.sh
使脚本可执行
用./myscript.sh /folder/to/monitor
运行它
如果您不提供参数,它将默认使用工作目录。
此外,您可以运行几个命令,在上一个命令的末尾添加&& \
以添加下一个命令:
#!/bin/bash
while true; do
inotifywait -e modify,create,delete,move -r $1 && \
echo "event" && \
echo "event 2"
done
如果您不想对事件执行任何命令,只需使用-m
修饰符直接运行命令,因此不会关闭:
inotifywait -e modify,create,delete,move -m -r /path/to/your/dir
当你有很多子目录时,inotify是最好的选择,但如果不是,我习惯使用下面的命令:
watch -d find <<path>>