inotifywaitコマンドでファイル変更をリアルタイム監視する方法|スクリプト自動化と実務活用も

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips > inotifywaitコマンドでファイル変更をリアルタイム監視する方法|スクリプト自動化と実務活用も
「設定ファイルを変更したら自動でサービスを再起動したい」
「ログファイルが更新されたタイミングで処理を走らせたい」
サーバー運用をしていると、ファイルの変更を検知して自動で何かしたい場面は頻繁にあります。

この記事では、inotifywait コマンドを使ってファイルやディレクトリの変更をリアルタイムで監視する方法を解説します。
基本的な書式から、シェルスクリプトとの組み合わせ、実務でよく使う自動化パターンまでカバーします。

この記事のポイント

・inotifywait でファイル変更・作成・削除をリアルタイムで検知できる
・-e オプションでイベント種別を絞り込み、誤検知を防ぐ
・while ループと組み合わせて自動処理スクリプトを書ける
・inotify-tools パッケージのインストールで即使える(RHEL9/Ubuntu24.04対応)


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

inotifywaitとは|Linuxカーネルの仕組みを活かした監視

inotifywait は、Linuxカーネルに組み込まれた inotify 機能を利用して、ファイルシステムのイベントを監視するコマンドです。

inotify はカーネルレベルでファイルの変更を追跡するため、ポーリング(定期的にファイルを確認する方式)と比べて次の点が優れています。

リアルタイム検知:変更の瞬間にイベントが通知される
CPU負荷が低い:ポーリングと違い、変更がなければほぼ処理が走らない
正確な検知:書き込み完了・削除・属性変更など、イベント種別を区別できる

cron で定期実行するより「変化があったときだけ動く」スクリプトが書けるため、設定ファイルの変更検知やデプロイの自動化に向いています。

実行環境:RHEL 9.4 / Ubuntu 24.04 LTS(inotify-tools パッケージ)

インストール方法

inotifywaitinotify-tools パッケージに含まれています。
OS に合わせて次のようにインストールしてください。

1. RHEL 9 / Rocky Linux 9 / AlmaLinux 9 の場合

RHEL 系は EPEL リポジトリが必要です。

# EPEL リポジトリを有効化 $ sudo dnf install -y epel-release # inotify-tools をインストール $ sudo dnf install -y inotify-tools # バージョン確認 $ inotifywait --version inotifywait 3.22.6.0

2. Ubuntu 24.04 LTS / Debian の場合

Ubuntu は標準リポジトリに含まれているため、EPEL は不要です。

$ sudo apt install -y inotify-tools # バージョン確認 $ inotifywait --version inotifywait 3.22.6.0

基本的な使い方

1. 書式と単発監視

基本書式は次のとおりです。

# 基本書式 inotifywait [オプション] 監視対象ファイル/ディレクトリ # 単発監視: /etc/nginx/nginx.conf が変更されるまで待機する $ inotifywait /etc/nginx/nginx.conf Setting up watches. Watches established. /etc/nginx/nginx.conf MODIFY

コマンドを実行すると「Watches established.」と表示されて待機します。
別のターミナルで設定ファイルを編集すると、即座に MODIFY イベントが出力され、コマンドが終了します。

2. -e オプションでイベント種別を絞り込む

デフォルトではすべてのイベントを検知しますが、-e オプションで種別を絞り込めます。

# 書き込み完了(CLOSE_WRITE)のみ検知する $ inotifywait -e close_write /tmp/test.txt Setting up watches. Watches established. /tmp/test.txt CLOSE_WRITE,CLOSE

代表的なイベント種別は次のとおりです。

modify:ファイルの内容が変更された
close_write:書き込みのためオープンされたファイルがクローズされた(書き込み完了)
create:ディレクトリ内にファイルが作成された
delete:ファイルが削除された
moved_to:ファイルが別の場所から移動されてきた
attrib:パーミッションや所有者などの属性が変更された

実務では close_write が特に重要です。modify はファイルへの書き込みごとにイベントが発生するため、大きなファイルのコピー中に何度もトリガーされることがあります。close_write なら「書き込みが完了してファイルが閉じられた」タイミングで1回だけ検知できます。

3. ディレクトリを再帰的に監視する

-r オプションを使うと、ディレクトリ内のすべてのファイルとサブディレクトリを監視できます。

# /var/www/html 配下を再帰的に監視 $ inotifywait -r -e close_write,create,delete /var/www/html Setting up watches. Finished establishing watches, now continuing. /var/www/html/css/ CLOSE_WRITE,CLOSE style.css /var/www/html/ CREATE newfile.html

出力は「ディレクトリ イベント ファイル名」の3カラム形式です。どのファイルで何が起きたかをスクリプトで解析しやすい構成になっています。

--monitor オプションで連続監視する

デフォルトの inotifywait は1回イベントを検知すると終了します。
継続して監視し続けるには --monitor(または -m)オプションを使います。

# /etc/nginx 配下を継続監視 $ inotifywait -m -r -e close_write,create,delete /etc/nginx Setting up watches. Finished establishing watches, now continuing. /etc/nginx/conf.d/ CLOSE_WRITE,CLOSE api.conf /etc/nginx/nginx.conf CLOSE_WRITE,CLOSE ^C # Ctrl+C で終了

--monitor モードは Ctrl+C で終了するまでイベントを出力し続けます。
ログ調査や開発中のデバッグ目的で手動実行するケースに向いています。

シェルスクリプトと組み合わせた自動化

inotifywait の真価は、シェルスクリプトと組み合わせた自動化です。
実務でよく使う3つのパターンを紹介します。

1. 設定ファイルの変更を検知してサービスを自動再起動する

Nginx の設定ファイルが更新されたら自動で設定テスト+リロードするスクリプトです。

#!/bin/bash # /usr/local/bin/watch-nginx-conf.sh WATCH_DIR="/etc/nginx" echo "Watching: ${WATCH_DIR}" while inotifywait -r -e close_write,create,delete --quiet "${WATCH_DIR}"; do echo "[$(date '+%Y-%m-%d %H:%M:%S')] 設定ファイル変更を検知" if nginx -t 2>&1; then echo "設定テスト OK - nginx をリロードします" systemctl reload nginx else echo "設定テスト NG - リロードをスキップします" >&2 fi done

while inotifywait ... ; do の構造がポイントです。
inotifywait がイベントを検知して終了するたびに while ループが回り、その中の処理(設定テスト+リロード)が実行されます。
処理が終わると再び inotifywait で次のイベントを待機します。

2. アップロードされたファイルを自動処理する

特定ディレクトリにファイルが置かれたら処理を実行するパターンです。
FTP や scp でファイルをアップロードする運用でよく使います。

#!/bin/bash # /usr/local/bin/watch-upload.sh WATCH_DIR="/var/upload/incoming" PROCESSED_DIR="/var/upload/processed" while IFS= read -r -d '' event_dir event_name; do FILE="${event_dir}${event_name}" echo "[$(date '+%Y-%m-%d %H:%M:%S')] 新規ファイル検知: ${FILE}" # ここに処理を追加(例: 変換・移動) mv "${FILE}" "${PROCESSED_DIR}/" done < <(inotifywait -m -r -e close_write \ --format '%w%0%f%0' \ --quiet "${WATCH_DIR}")

--format '%w%f' を指定すると、ディレクトリパスとファイル名を整形して出力できます。
%w がディレクトリ(末尾スラッシュあり)、%f がファイル名です。

3. バックグラウンドで起動して systemd サービス化する

監視スクリプトを systemd サービスとして登録すると、OS 再起動後も自動起動できます。

# /etc/systemd/system/watch-nginx-conf.service [Unit] Description=Watch Nginx config and reload on change After=network.target [Service] Type=simple ExecStart=/usr/local/bin/watch-nginx-conf.sh Restart=on-failure [Install] WantedBy=multi-user.target

# サービスを有効化・起動する $ sudo systemctl daemon-reload $ sudo systemctl enable watch-nginx-conf.service $ sudo systemctl start watch-nginx-conf.service # 状態確認 $ sudo systemctl status watch-nginx-conf.service * watch-nginx-conf.service - Watch Nginx config and reload on change Loaded: loaded (/etc/systemd/system/watch-nginx-conf.service; enabled) Active: active (running) since Mon 2026-04-27 10:00:00 JST; 1min ago Main PID: 12345 (watch-nginx-conf)

トラブルシュート|よくあるエラーと対処法

「Failed to watch: inotify watch limit reached」が出た

監視するファイル数がカーネルの上限を超えると、このエラーが発生します。
特に -r オプションで大きなディレクトリを再帰監視しているときに起きやすいです。

# 現在の上限を確認する $ cat /proc/sys/fs/inotify/max_user_watches 8192 # 上限を一時的に増やす(再起動で元に戻る) $ sudo sysctl fs.inotify.max_user_watches=524288 # 永続化する場合は /etc/sysctl.conf に追記 $ echo "fs.inotify.max_user_watches=524288" | sudo tee -a /etc/sysctl.conf $ sudo sysctl -p

max_user_watches の適切な値はシステム規模によって異なりますが、一般的なサーバーでは 524288(512K)程度を設定することが多いです。

イベントが検知されない

イベントが検知されない場合は、次の点を確認してください。

-e オプションのイベント名を確認する:大文字・小文字は区別されません(CLOSE_WRITEclose_write も動作します)が、スペルミスに注意
NFS マウントのディレクトリを監視していないか:inotify はローカルファイルシステムのみ対応。NFS・CIFS など ネットワークファイルシステムでは動作しません
シンボリックリンク先を監視していないか:inotifywait はシンボリックリンク自体を監視します。リンク先の変更は検知されません

「inotifywait: command not found」が出た

inotify-tools がインストールされていない場合のエラーです。
冒頭の「インストール方法」セクションを参照してインストールしてください。

本記事のまとめ

inotifywait の主なオプションと使い方をまとめます。
やりたいこと コマンド
ファイルが変更されるまで待機する inotifywait /path/to/file
書き込み完了イベントのみ検知する inotifywait -e close_write /path/to/file
ディレクトリを再帰的に監視する inotifywait -r -e close_write /path/to/dir
継続して監視し続ける inotifywait -m -r /path/to/dir
while ループで変更ごとに処理を実行する while inotifywait -e close_write /path; do 処理; done
監視数上限を増やす(永続化) echo "fs.inotify.max_user_watches=524288" | sudo tee -a /etc/sysctl.conf
inotifywait は、設定ファイルの自動反映・ファイルアップロードの自動処理・デプロイの自動化など、サーバー運用の定番自動化ツールです。
ポーリングに比べてリアルタイム性が高くCPU負荷も低いため、ぜひ実務に取り入れてみてください。

内部リンクとして、ファイルシステムへのマウント操作については mount コマンドの使い方、ディレクトリやファイルの使用量調査には dmidecode でハードウェア情報を取得 もあわせて参照してください。
また、変更検知後の自動処理でよく使う ls コマンドについては ls コマンドの基本オプション もご覧ください。

シェルスクリプトの自動化や、サーバー運用の「型」が身についていますか?

inotifywait ひとつとっても、イベント種別の使い分けや while ループの組み方を知らなければ、自動化スクリプトが誤動作したとき対処できません。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。