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

时间:2012-01-02 09:37:41

标签: linux monitoring filesystemwatcher inotify

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

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

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

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

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

9 个答案:

答案 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来获得,并且据我所知(14505901564720)几乎已经两次进入Fedora。

答案 8 :(得分:-2)

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

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