如何在Linux中监控完整的目录树的更改?

如何在Linux中监控完整的目录树的更改?,linux,monitoring,filesystemwatcher,inotify,Linux,Monitoring,Filesystemwatcher,Inotify,如何在Linux(ext3文件系统)中监视整个目录树的更改 目前,该目录包含约50万个文件,位于约3000个子目录中,分为三个目录级别 这些文件大多是小文件( FordRead子< /代码>在在folder\u sub中创建folder\u sub\u sub,在folder\u main到达之前,手表设置在folder\u sub上,但folder\u sub已丢失,此外,它还没有安装手表?Ubuntu18.04现在默认的“max_user_watches”设置为65536,这在普通的桌面/服

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

目前,该目录包含约50万个文件,位于约3000个子目录中,分为三个目录级别

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

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


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

据我所知,除了递归地在每个目录上设置一个
inotify
监视之外,没有其他方法了

也就是说,您不会用完文件描述符,因为
inotify
不必保留fd来查看文件或目录(其前身
dnotify
,确实受到此限制)<代码>inotify使用“监视描述符”


根据的文档,默认限制为8192个手表描述符,您可以通过将新值写入
/proc/sys/fs/inotify/max_user_watchs

来增加它。fanotify最终不应该提供这种功能吗? 引述:

“fanotify有两种基本的“模式”,即定向模式和全局模式。[…]fanotify global表示 它需要系统上的所有内容,然后单独标记 它不关心的inodes。”


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

我使用
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
#/bin/bash
虽然真实;做
inotifywait-e修改、创建、删除-r/path/to/your/dir&&\
完成
这将在整个树上设置递归目录监视,并允许您在发生更改时执行命令。如果您只想查看更改,可以添加
-m
标志将其置于监视模式

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

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

使用inotify工具中的inotifywait:

sudo apt安装inotify工具

现在创建一个脚本
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修改、创建、删除、移动-m-r/path/to/your/dir
当您有许多子目录时,inotify是最好的选择,但如果没有,我习惯于使用以下命令:


watch-d find

我有一个不同的建议,只针对文件中的更改,并记录历史更改

使用git

cd/文件夹到监视器
初始化
git添加*
git提交-m“第一个快照”
所以在你做出改变之后

git-diff

特别是对于大型或复杂的监控任务,如果您希望根据看到的内容触发事件,请查看。下面是一个简单的示例,用于在css文件发生更改时运行名为minify css的工具:

$ watchman watch ~/src
$ watchman -- trigger ~/src buildme '*.css' -- minify-css
它可以进行全面的日志记录,可以有效地处理目录结构中重叠的多个监视,可以从命令行或通过json进行管理,等等。另见


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

我用它在当前目录中快速浏览:

watch 'find . -printf "%T@ %Tc %p\n" | sort -nr | head '

听起来不错。当使用这么多的手表描述符时,你会考虑到任何负面的方面吗?不,除了创建所有的手表所花费的时间,我不认为你只会遇到3000个子目录的问题。这不会造成可能的种族问题吗?比如:<代码> > FordRead子< /代码>在<代码>在
folder\u sub
中创建
folder\u sub\u sub
,在
folder\u main
到达之前,手表设置在
folder\u sub
上,但
folder\u sub
已丢失,此外,它还没有安装手表?Ubuntu18.04现在默认的“max_user_watches”设置为65536,这在普通的桌面/服务器系统中似乎是一个合理的值。。。fanotify进入2.6.36。要避免
while循环
,请使用
-m
--monitor
开关/选项/标志/参数。不知道“开关”是什么时候产生的,但比循环更好。您还应该添加
move
事件:
inotifywait-e modify,create,delete,move-r/path/to/your/dir
watch是首选的
watch
不允许分页,因此它会丢失任何超过终端高度的内容(例如,
tree
带有文件数的命令>终端行数)我想看看硬件(以及该方法对其工作负载的影响)它支持每5-10秒查找50万个文件。……如果我是你的系统管理员,看到你创建了这种负载,我会找到你,并给你一个非常严厉的谈话。@tink当然,如果你有很多文件要检查,多次运行
查找
,是不可取的。我的回答可以帮助那些想进去的人检查子目录,但无权访问中的