inotify を用いてファイル操作の監視(Ubuntu 上)
Linuxカーネルのinotify機能はファイルシステムのイベントを通知する。inotify-toolsパッケージのinotifywaitコマンドでイベントを待機・表示でき、aptでインストールする。オプション -r で再帰監視、-m で継続監視、--format と --timefmt で出力形式を指定する。監視数の上限は sysctl で変更できる。
inotify はLinuxカーネルが提供する機能である。ファイルやディレクトリに対する操作(作成、削除、変更、移動など)が発生したときに、アプリケーションへ通知する。inotify-tools は、inotify を利用するためのコマンド群である。その中の inotifywait コマンドは、指定したイベントの発生を待ち、その情報を標準出力に表示する。
インストール
inotifywaitコマンドを含む inotify-tools パッケージは、標準のリポジトリからインストールできる。次のコマンドを実行する。
# パッケージリストの情報を更新
sudo apt update
sudo apt -y install inotify-tools
このコマンドにより、inotifywait や inotifywatch がインストールされる。
使い方の例
指定したディレクトリとそのサブディレクトリのファイル操作イベントを、再帰的かつ継続的に監視する例を示す。次のコマンドは、ホームディレクトリに移動し、そこを監視対象とする。
cd
inotifywait -rm --timefmt '%H:%M:%S' --format '%T %w%f %e' .
このコマンドで使用しているオプションは次の通りである。
-r,--recursive: 指定したディレクトリに加え、その配下のサブディレクトリも監視対象に含める。サブディレクトリごとに監視が設定されるため、大きなディレクトリツリーでは監視の設定完了までに時間がかかる。-m,--monitor: イベントが発生しても終了せず、監視を続ける。このオプションを指定しない場合は、最初のイベントで終了する。--timefmt '%H:%M:%S':%Tで表示する時刻の書式を指定する。書式は strftime の形式で記述する。--formatで%Tを使うときは、このオプションの指定が必要である。--format '%T %w%f %e': イベント発生時の出力形式を指定する。
--format オプションで使用できる主な書式は次の通りである。
%T: イベントが発生した時刻。書式は--timefmtオプションで指定する。%w: 監視対象のパス。監視対象ディレクトリ内でイベントが発生した場合は、そのディレクトリのパスになる。%f: イベントが発生したファイルまたはディレクトリの名前。監視対象ディレクトリ内のイベントでない場合は空文字列になる。%e: 発生したイベントの種類。複数同時に発生した場合はカンマ区切りで表示される(例:CREATE,DELETE,MODIFY,MOVED_FROM,MOVED_TO,CLOSE_WRITE)。
上記のコマンドの実行中に、監視対象ディレクトリ内でファイルを作成したり内容を変更したりすると、次の形式でイベント情報が出力される。
HH:MM:SS /path/to/directory/FILENAME EVENT1,EVENT2,...
監視数の上限の確認と変更
inotify が1ユーザあたりに設定できる監視数には上限がある。多数のディレクトリを再帰的に監視すると、この上限に達して監視できないことがある。現在の値は次のコマンドで確認する。
cat /proc/sys/fs/inotify/max_user_watches
既定値はカーネルのバージョンと搭載メモリ量で異なる。Linux 5.11 以降のカーネル(Ubuntu 24.04 LTS を含む)では、搭載メモリ量に応じて自動的に決まる。値を一時的に変更するには次のコマンドを実行する。
sudo sysctl fs.inotify.max_user_watches=524288
再起動後も設定を保持するには、設定ファイルに記述して反映する。次のコマンドを実行する。
echo 'fs.inotify.max_user_watches=524288' | sudo tee /etc/sysctl.d/60-inotify.conf
sudo sysctl --system
なお、inotify はネットワークファイルシステム(NFSなど)上の他ホストからの変更、疑似ファイルシステム(/proc, /sys など)の変更、およびメモリマップによる書き込みを検出できない。これらを対象とする場合は、定期的にファイルの状態を確認する方法を用いる。