「ログファイルが更新されたタイミングで処理を走らせたい」
サーバー運用をしていると、ファイルの変更を検知して自動で何かしたい場面は頻繁にあります。
この記事では、inotifywait コマンドを使ってファイルやディレクトリの変更をリアルタイムで監視する方法を解説します。
基本的な書式から、シェルスクリプトとの組み合わせ、実務でよく使う自動化パターンまでカバーします。
この記事のポイント
・inotifywait でファイル変更・作成・削除をリアルタイムで検知できる
・-e オプションでイベント種別を絞り込み、誤検知を防ぐ
・while ループと組み合わせて自動処理スクリプトを書ける
・inotify-tools パッケージのインストールで即使える(RHEL9/Ubuntu24.04対応)
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
inotifywaitとは|Linuxカーネルの仕組みを活かした監視
inotifywait は、Linuxカーネルに組み込まれた inotify 機能を利用して、ファイルシステムのイベントを監視するコマンドです。inotify はカーネルレベルでファイルの変更を追跡するため、ポーリング(定期的にファイルを確認する方式)と比べて次の点が優れています。
・リアルタイム検知:変更の瞬間にイベントが通知される
・CPU負荷が低い:ポーリングと違い、変更がなければほぼ処理が走らない
・正確な検知:書き込み完了・削除・属性変更など、イベント種別を区別できる
cron で定期実行するより「変化があったときだけ動く」スクリプトが書けるため、設定ファイルの変更検知やデプロイの自動化に向いています。
実行環境:RHEL 9.4 / Ubuntu 24.04 LTS(inotify-tools パッケージ)
インストール方法
inotifywait は inotify-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
別のターミナルで設定ファイルを編集すると、即座に
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
--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_WRITE も close_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 |
ポーリングに比べてリアルタイム性が高くCPU負荷も低いため、ぜひ実務に取り入れてみてください。
内部リンクとして、ファイルシステムへのマウント操作については mount コマンドの使い方、ディレクトリやファイルの使用量調査には dmidecode でハードウェア情報を取得 もあわせて参照してください。
また、変更検知後の自動処理でよく使う ls コマンドについては ls コマンドの基本オプション もご覧ください。
シェルスクリプトの自動化や、サーバー運用の「型」が身についていますか?
inotifywait ひとつとっても、イベント種別の使い分けや while ループの組み方を知らなければ、自動化スクリプトが誤動作したとき対処できません。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:blkidコマンドでブロックデバイスのUUIDとラベルを確認する方法|fstabへの応用まで
- 前のページへ:timeoutコマンドで制限時間付きでコマンドを実行する方法|ハングアップ対策とシェルスクリプト活用も
- この記事の属するカテゴリ:Linuxtipsへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます