web-dev-qa-db-ja.com

Linuxの変更について完全なディレクトリツリーを監視する方法

ディレクトリツリー全体 Linuxの変更を監視するにはどうすればよいですか(extファイルシステム)。

現在、ディレクトリには約50万個のファイルが約3,000個のサブディレクトリに含まれており、3つのディレクトリレベルに編成されています。

それらはほとんどが小さなファイルです(<1kb、いくつかは最大100kb)。それは一種のキューであり、その発生から5〜10秒以内にファイルが作成、削除、またはコンテンツが変更されるタイミングを知る必要があります。

inotifyと並べ替えがあることは知っていますが、知っている限り、単一のディレクトリのみを監視します。つまり、私の場合は3,000個のinotifyハンドルが必要です。それとも私は間違っていますか?

必要なものをLinuxシステムが教えてくれない場合:ファイルシステムをシミュレートする(実際のファイルシステム上のすべてのファイルアクセスを複製する) Fuse プロジェクトがある可能性がありますすべての変更(大丈夫ではない)?

51
Udo G

私の知る限り、各ディレクトリにinotifyウォッチを再帰的に設定する以外に方法はありません。

ただし、inotifyはファイルまたはディレクトリを監視するためにfdを予約する必要がないため、ファイル記述子が不足することはありません(その前身であるdnotifyはこの制限を受けていました) 。 inotifyは代わりに「監視記述子」を使用します。

inotifywatch のドキュメントによると、デフォルトの制限は8192個の監視記述子であり、/proc/sys/fs/inotify/max_user_watchesに新しい値を書き込むことでそれを増やすことができます。

13

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フラグを使用して、モニターモードにします。

55
$ inotifywait -m -r /path/to/your/directory

このコマンドは、アクセス、オープン、作成、削除などのすべてのイベントについてディレクトリを再帰的に監視するのに十分です...

17
Madan Kumar

inotifyは、多くのサブディレクトリがある場合に最適なオプションですが、そうでない場合は、以下のこのコマンドの使用に慣れています。

watch -d find <<path>>

5
fmassica

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

3
Smeterlink

Fanotifyは最終的にその機能を提供することになっていないのですか?引用 [〜#〜] lwn [〜#〜]

fanotifyには、ダイレクトとグローバルの2つの基本的な「モード」があります。 [...] fanotify globalは代わりに、システム上のすべてのものが必要であることを示し、気にしないiノードを個別にマークします。

しかし、私はその最新の状態がどうなっているかを失いました。

3
jørgensen