如何在Linux中监视完整的目录树以进行更改?

问题描述 投票:44回答:6

如何监视整个目录树以查找Linux(ext3文件系统)中的更改?

目前,该目录在大约3,000个子目录中包含大约五十万个文件,以三个目录级别组织。

这些大多是小文件(<1kb,少数高达100 kb)。这是一种队列,我需要知道何时创建,删除文件或在发生的5-10秒内修改其内容。

我知道有inotify和排序,但AFAIK他们只监视一个目录,这意味着在我的情况下我需要3,000个inotify句柄 - 比单个进程允许的通常1024个句柄更多。还是我错了?

如果Linux系统无法告诉我我需要什么:也许有一个FUSE项目模拟文件系统(复制真实文件系统上的所有文件访问)并单独记录所有修改(不能很好)?

linux monitoring filesystemwatcher inotify
6个回答
13
投票

据我所知,除了在每个目录上递归设置inotify手表之外别无他法。

也就是说,你不会用完文件描述符,因为inotify不必保留fd来观察文件或目录(它的前身,dnotify,确实受到这种限制)。 inotify使用“手表描述符”代替。

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


51
投票

我使用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标志以将其置于监控模式。


13
投票
$ inotifywait -m -r /path/to/your/directory

此命令足以以递归方式查看所有事件的目录,例如访问,打开,创建,删除......


3
投票

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

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

但是我忘记了它的最新状态。


2
投票

使用来自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


1
投票

当你有很多子目录时,inotify是最好的选择,但如果不是,我习惯使用下面的命令:

watch -d find <<path>>

© www.soinside.com 2019 - 2024. All rights reserved.