如何监控整个目录树以查找Linux( ext3 文件系统)中的更改?
目前,该目录在 3,000个子目录中包含约五十万个文件,分为三个目录级别。
这些大多是小文件(<1kb,少数高达100 kb)。这是一种队列,我需要知道何时创建,删除文件或在发生的5-10秒内修改其内容。
我知道有 inotify 和排序,但是AFAIK他们只监控一个目录,这意味着在我的情况下我需要3,000个inotify句柄 - 比单个进程允许的通常1024个句柄更多。或者我错了吗?
如果Linux系统无法告诉我我需要什么:可能有一个FUSE项目模拟文件系统(复制真实文件系统上的所有文件访问)并单独记录所有修改(不能罚款)?
答案 0 :(得分:51)
我使用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
标志以将其置于监控模式。
答案 1 :(得分:14)
let jsonDictionary = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: nil)
completion(jsonDictionary)
default:
print("GET request not successful. HTTP status code: \(httpResponse.statusCode)")
}
} else {
print("Error: Not a valid HTTP response")
}
}
dataTask.resume()
}
}
此命令足以以递归方式查看所有事件的目录,例如访问,打开,创建,删除......
答案 2 :(得分:13)
据我所知,除了在每个目录上递归设置inotify
监视外别无他法。
也就是说,你不会用完文件描述符,因为inotify
不必保留fd来监视文件或目录(它的前身,dnotify
,确实遭受了这个限制)。 inotify
使用“监视描述符”。
根据inotifywatch的文档,默认限制为8192个监视描述符,您可以通过将新值写入/proc/sys/fs/inotify/max_user_watches
来增加它。
答案 3 :(得分:3)
最终没有狂热化应该提供这种能力吗? 引用LWN:
“ fanotify有两个基本'模式'指向和全局。 [...] fanotify全球反而表明 它想要系统上的所有内容然后单独标记 它不关心的inode。“
但是,我忘记了它的最新状态。答案 4 :(得分:2)
使用来自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
答案 5 :(得分:2)
inotify是最好的选择,但如果没有,我习惯使用下面的命令:
Ctrl+Shift+Enter
答案 6 :(得分:0)
我有不同的建议,仅用于文件更改,并记录历史记录更改
使用git
'redis' => [
'client' => env('REDIS_CLIENT', 'phpredis'),
'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
// 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_database_'),
],
'default' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_DB', '0'),
],
'cache' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_CACHE_DB', '1'),
],
],
因此您进行更改后
cd /folder_to_monitor
git init
git add *
git commit -m "first snapshot"
答案 7 :(得分:0)
特别是对于要根据看到的事件触发事件的大型或复杂监视任务,请签出Watchman A file watching service。这是一个简单的示例,只要更改CSS文件,即可运行名为minify-css的工具:
$ watchman watch ~/src
$ watchman -- trigger ~/src buildme '*.css' -- minify-css
它具有全面的日志记录功能,可以有效地处理目录结构中重叠的多个手表,可以从命令行或通过json进行管理,等等。另请参见
它可以通过Debian Sid和Ubuntu 20.04来获得,并且据我所知(1450590和1564720)几乎已经两次进入Fedora。
答案 8 :(得分:-2)
我用它来快速浏览当前目录:
watch 'find . -printf "%T@ %Tc %p\n" | sort -nr | head '