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

Udo*_*o G 56 linux monitoring filesystemwatcher inotify

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

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

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

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

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

Jas*_*zek 66

我使用该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
Run Code Online (Sandbox Code Playgroud)

这将在整个树上设置递归目录监视,并允许您在发生更改时执行命令.如果您只想查看更改,可以添加-m标志以将其置于监控模式.

  • 为了避免`while循环`使用`-m`或`--monitor`开关/选项/ flag/arg.不知道'switch'何时产生,但比循环更好 (6认同)
  • 您还应该添加 `move` 事件:`inotifywait -e modify,create,delete,move -r /path/to/your/dir` (3认同)
  • 如果其中两个事件在一瞬间发生,这种方法难道不会错过一个事件吗?inotifywait存在之后,会有一段时间没有监听任何事件,不是吗? (3认同)
  • 这比接受的答案更有帮助,+ 1 (2认同)

小智 19

$ inotifywait -m -r /path/to/your/directory
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,但是诸如访问和打开之类的事件是非常有问题的。取决于你的意图是什么。示例:每次 www 目录中发生更改时,我想重新启动“cordova run”。结果,cordova 生成的 open,access 事件触发了 inotifywait,进入无限循环。`-e 修改、创建、删除、移动`更适合大多数用途。 (3认同)

Fré*_*idi 14

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

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

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

  • Ubuntu 18.04 现在默认的“max_user_watches”设置为 65536,这在普通桌面/服务器系统中似乎是一个合理的值。 (2认同)

fma*_*ica 8

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

watch -d find <<path>>

  • 我很想看到支持每 5-10 秒对 50 万个文件进行“查找”的硬件(以及该方法对其工作负载的影响)。...如果我是你的系统管理员并看到你创建了这种负载,我会追捕你并给你一个**非常**严厉的谈话。 (3认同)
  • `watch` 不允许分页,因此它会丢失任何长于终端高度的内容(例如,文件数 &gt; 终端行数的 `tree` 命令) (2认同)

Mr *_*ido 8

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

使用git

cd /folder_to_monitor
git init
git add *
git commit -m "first snapshot"
Run Code Online (Sandbox Code Playgroud)

所以在你做出改变之后

git diff
Run Code Online (Sandbox Code Playgroud)

  • 在某些情况下这可能是一个有效的选择。不值得-1 (3认同)

Sme*_*ink 6

使用 inotify-tools 中的 inotifywait:

sudo apt install inotify-tools

现在创建一个myscript.sh包含隐藏文件和文件夹的脚本:

#!/bin/bash
while true; do

inotifywait -e modify,create,delete,move -r $1

done
Run Code Online (Sandbox Code Playgroud)

使脚本可执行 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
Run Code Online (Sandbox Code Playgroud)

如果您不想对事件执行任何命令,只需使用-m修饰符直接运行该命令,这样就不会关闭:

inotifywait -e modify,create,delete,move -m -r /path/to/your/dir