待機の本体:
scripts/inbox_watcher.shがqueue/inbox/<agent>.yamlをinotifywaitで監視。変更イベントが来るまでブロックして待機。
どういう意味? inotifywait って何? これは「エージェント宛ての指示ファイル(YAML)が更新されるのを、Linux の仕組みで“待ち受ける”」という説明です。
scripts/inbox_watcher.sh というシェルスクリプトが動くqueue/inbox/<agent>.yaml(<agent>はエージェント名などに置き換わる)というファイルを監視する要するに「ポーリング(何秒ごとにファイルを見に行く)ではなく、OSから通知が来るまで寝て待つ」方式です。
inotifywait は Linux の inotify(ファイル変更通知) という機能を使って、
ためのコマンドです。通常は inotify-tools というパッケージに入っています。
inotifywait -e modify queue/inbox/agent1.yaml
このコマンドは agent1.yaml が更新(modify)されるまで待ち続け、更新されたら終了(あるいは次の処理へ)します。
ループで使うと「更新があるたびに処理」を作れます:
while inotifywait -e modify queue/inbox/agent1.yaml; do
echo "updated!"
done
CPUを使って延々チェックするのではなく、変更が来るまで処理が止まった状態になります(効率が良い)。
必要なら、その inbox_watcher.sh の中身を貼ってくれれば、どのイベントを監視してどう動く設計かも具体的に説明できます。
inotifywait ってどう実装されてるの? 自分でファイル監視処理をつくるより効率がいいのかな?
inotifywait は「Linuxカーネルが持っているファイル変更通知機能(inotify)」を、シェルから使いやすい形にしたコマンドです。実装はざっくり言うと “カーネルに監視登録して、イベントが来るまで寝る” だけです。
inotifywait 自体は inotify-tools というユーザー空間ツールの一部で、根っこは Linux の inotify API を呼んでいます。
典型的な流れ(概念)は以下です:
inotify_init1()(または inotify_init())を呼ぶinotify_add_watch(fd, path, mask)mask に IN_MODIFY, IN_CLOSE_WRITE, IN_CREATE, IN_MOVED_TO など監視したいイベント種別を指定read(fd, buf, ...) を呼ぶread() が返って、イベント構造体(struct inotify_event)がバッファに入ってくるinotifywait はそれを人間が見やすい形式に整形して標準出力に出す-m(monitor)を付けると終了せずに読み続ける(イベントごとに出力)つまり、実装の核心は 「inotify の fd を read して待つ」 で、ポーリングは基本しません。
結論:普通は inotify(= inotifywait の方式)の方が圧倒的に効率的です。
理由は「無駄なチェックをしない」からです。
例:1秒ごとに stat() して更新時刻を比較する、など
stat() 等のシステムコールが走る「ファイルを更新」する方法によって、欲しいイベントが変わります。
多くのツールは安全のために
1) 一時ファイルに書く
2) rename() で元ファイルを置き換える(原子的)
という手順を取ります。
この場合、元ファイルへの IN_MODIFY が来ないことがあります。代わりにディレクトリ側で
IN_MOVED_TO(新しいファイルが移動してきた)IN_CREATE(新規作成された)IN_DELETE / IN_MOVED_FROM(古い方が消えた/移動した)みたいなイベントになります。
対策:しばしば「ファイル1個」より 親ディレクトリを監視し、
create/moved_to/close_write などを見る方が堅いです。
「書き込み途中で反応したくない」なら IN_CLOSE_WRITE(書き込みでcloseされた)を見るのが定番です。
IN_MODIFY だと書き込み途中に何度も来る可能性があります。
イベントが短時間に大量発生するとキューが溢れて IN_Q_OVERFLOW が出ることがあります。
その場合は「確実性が落ちた」ので、再スキャン(ファイルを読み直して状態復元)が必要になります。
inbox_watcher.sh が実際にどのイベント(modify/close_write/moved_to など)で待っているか、監視対象がファイル単体かディレクトリかで堅牢性がかなり変わります。スクリプトの該当部分(inotifywait行)を貼ってくれれば、「この書き方だと取りこぼす可能性がある/ない」まで具体的に指摘できます。