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' .

このコマンドで使用しているオプションは次の通りである。

--format オプションで使用できる主な書式は次の通りである。

上記のコマンドの実行中に、監視対象ディレクトリ内でファイルを作成したり内容を変更したりすると、次の形式でイベント情報が出力される。

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 など)の変更、およびメモリマップによる書き込みを検出できない。これらを対象とする場合は、定期的にファイルの状態を確認する方法を用いる。