如何在Linux中监视整个目录树的更改?


74

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

当前,该目录在大约3,000个子目录中包含大约一百万个文件,并按三个目录级别进行组织。

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

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

万一Linux系统不能告诉我我需要什么:也许有一个FUSE项目可以模拟一个文件系统(在真实文件系统上复制所有文件访问权限)并分别记录所有修改(不能进行修改)吗?

Answers:


20

据我所知,除了inotify在每个目录上递归设置监视外,别无其他方法。

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

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


听起来不错。使用这么多的监视描述符时是否要考虑负面因素?
Udo G 2012年

不,除了创建所有手表所需的时间之外,我认为您不会遇到只有3000个子目录的问题。
弗雷德里克·哈米迪

这是否不会造成可能的比赛问题,例如:创建folder_subin folder_mainfolder_sub_subin创建,in的folder_subinotify folder_main,手表已设置folder_sub,但folder_sub_sub已经错过了,因此还没有安装手表?
Koen G.19年

2
Ubuntu 18.04现在的默认值'max_user_watches'现在设置为65536,这在正常的台式机/服务器系统中似乎是一个合理的值。
Lothar

76

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


7
为避免while loop使用-m--monitor开关/选项/标志/ arg。不知道这种“转换”是何时产生的,但是比循环好
gwillie

2
您还应该添加move事件: inotifywait -e modify,create,delete,move -r /path/to/your/dir
famzah

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

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


13

当您有许多子目录时,inotify是最佳选择,但如果没有,我习惯于在下面使用此命令:

watch -d find <<path>>


手表是def的首选
qodeninja

1
watch不允许分页,因此它将丢失任何超出终端高度的内容(例如,tree带有文件数的命令>终端行数)
Nick Bull

5

从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


4

fanotify是否最终应该提供该功能?报价LWN

fanotify有两种基本的‘模式’导演和全球性的。[...] fanotify全局表示它想要系统上的所有内容,然后分别标记它不关心的inode。

但是,我没有跟踪它的最新状态。


1
根据针对stackoverflow.com/a/1847268/130352的评论... fanotify进入2.6.36。
克里斯J

0

我有一个不同的建议,仅用于文件更改,并记录历史记录更改

使用git

cd /folder_to_monitor
git init
git add *
git commit -m "first snapshot"

所以在您进行更改之后

git diff

0

特别是对于要根据所看到的事件触发事件的大型或复杂监视任务,请查看Watchman A文件监视服务。这是一个简单的示例,只要更改CSS文件,即可运行名为minify-css的工具:

$ watchman watch ~/src
$ watchman -- trigger ~/src buildme '*.css' -- minify-css

它执行全面的日志记录,可以有效地处理目录结构中重叠的多个手表,可以从命令行或通过json进行管理,等等。也可以看看

它可以通过Debian Sid和Ubuntu 20.04获得,并且从我所看到的(14505901564720)几乎已经两次进入Fedora 。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.