86

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

目前,该目录在大约3,000 个子目录中包含大约50 万个文件,分为三个目录级别。

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

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

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

4

9 回答 9

89

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

于 2013-11-01T19:04:32.650 回答
37
$ inotifywait -m -r /path/to/your/directory

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

于 2015-09-03T07:19:25.527 回答
24

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

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

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

于 2012-01-02T09:47:36.497 回答
16

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

watch -d find <<path>>

于 2018-06-06T19:43:37.073 回答
9

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

于 2018-05-01T11:21:47.010 回答
4

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

“<em>fanotify 有两种基本的‘模式’定向和全局。[...] fanotify global 表示它想要系统上的所有内容,然后单独标记它不关心的 inode。”</p>

不过,我不知道它的最新状态是什么。

于 2012-01-02T13:23:05.687 回答
4

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

使用 git

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

所以在你做出改变之后

git diff
于 2020-08-25T04:24:06.800 回答
0

特别是对于大型或复杂的监视任务,您希望根据所见触发事件,请查看Watchman 文件监视服务。这是一个简单的示例,用于在 CSS 文件更改时运行名为 minify-css 的工具:

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

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

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

于 2020-09-28T17:39:03.710 回答
-2

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

watch 'find . -printf "%T@ %Tc %p\n" | sort -nr | head '
于 2021-02-07T15:58:56.913 回答