ディレクトリツリー全体 Linuxの変更を監視するにはどうすればよいですか(extファイルシステム)。
現在、ディレクトリには約50万個のファイルが約3,000個のサブディレクトリに含まれており、3つのディレクトリレベルに編成されています。
それらはほとんどが小さなファイルです(<1kb、いくつかは最大100kb)。それは一種のキューであり、その発生から5〜10秒以内にファイルが作成、削除、またはコンテンツが変更されるタイミングを知る必要があります。
inotifyと並べ替えがあることは知っていますが、知っている限り、単一のディレクトリのみを監視します。つまり、私の場合は3,000個のinotifyハンドルが必要です。それとも私は間違っていますか?
必要なものをLinuxシステムが教えてくれない場合:ファイルシステムをシミュレートする(実際のファイルシステム上のすべてのファイルアクセスを複製する) Fuse プロジェクトがある可能性がありますすべての変更(大丈夫ではない)?
私の知る限り、各ディレクトリにinotify
ウォッチを再帰的に設定する以外に方法はありません。
ただし、inotify
はファイルまたはディレクトリを監視するためにfdを予約する必要がないため、ファイル記述子が不足することはありません(その前身であるdnotify
はこの制限を受けていました) 。 inotify
は代わりに「監視記述子」を使用します。
inotifywatch のドキュメントによると、デフォルトの制限は8192個の監視記述子であり、/proc/sys/fs/inotify/max_user_watches
に新しい値を書き込むことでそれを増やすことができます。
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
フラグを使用して、モニターモードにします。
$ inotifywait -m -r /path/to/your/directory
このコマンドは、アクセス、オープン、作成、削除などのすべてのイベントについてディレクトリを再帰的に監視するのに十分です...
inotifyは、多くのサブディレクトリがある場合に最適なオプションですが、そうでない場合は、以下のこのコマンドの使用に慣れています。
watch -d find <<path>>
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
Fanotifyは最終的にその機能を提供することになっていないのですか?引用 [〜#〜] lwn [〜#〜] :
「fanotifyには、ダイレクトとグローバルの2つの基本的な「モード」があります。 [...] fanotify globalは代わりに、システム上のすべてのものが必要であることを示し、気にしないiノードを個別にマークします。
しかし、私はその最新の状態がどうなっているかを失いました。