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标志以将其置于监控模式.
小智 19
$ inotifywait -m -r /path/to/your/directory
Run Code Online (Sandbox Code Playgroud)
此命令足以以递归方式查看所有事件的目录,例如访问,打开,创建,删除......
Fré*_*idi 14
据我所知,除了inotify在每个目录上递归设置监视之外别无他法.
也就是说,你不会用完文件描述符,因为inotify不必保留fd来观察文件或目录(它的前身dnotify,确实受到这种限制).inotify使用"手表描述符"代替.
根据inotifywatch的文档,默认限制是8192个监视描述符,您可以通过将新值写入来增加它/proc/sys/fs/inotify/max_user_watches.
当您有许多子目录时,inotify是最佳选择,但如果没有,我习惯于在下面使用此命令:
watch -d find <<path>>
我有不同的建议,仅针对文件中的更改,并记录历史更改
使用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)
使用 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
| 归档时间: |
|
| 查看次数: |
40529 次 |
| 最近记录: |