inotifywaitとinodeとcpとmvのお話し

テクノロジー

こんにちは、リコタです。

最近お仕事でlinuxコマンドの「inotifywait」を使う機会があったのですが、基本的なことでつまづいてしまったので備忘録を残しておきます。

やりたかったこと

inotifywaitを使って特定のディレクトリを監視し、そのディレクトリにファイルが移動してきたら処理をする、ということをやろうとしました。

その時に、移動するファイル名のファイルは、当該のディレクトリに既に存在している前提なのでファイルを上書きする形になります。

右の「ふぁいる.txt」があるディレクトリに、別の場所から「ふぁいる.txt」を移動させた時に処理を実行させます。

使ったイベント

inotifywaitのオプション「-e」の「MOVED_TO」を使いました。

これは指定したディレクトリにファイルが移動してきたら発火するイベントですね。

cpコマンド

別のディレクトリからcpコマンドを使って「ふぁいる.txt」を監視ディレクトリにコピーしました。

私はこれでinotifywaitの通知を受け取れると思っていたのですが、受け取れませんでした。あれれ。

mvコマンド

別のディレクトリから今度はmvコマンドを使って「ふぁいる.txt」を監視ディレクトリに移動しました。

すると通知を受け取ることができました。あれれ。

inode

cpもmvも同じようにファイルを移動させている(ように見える)のになぜinotify -e MOVED_TO はmvでだけ反応したのか。

どうやらMOVED_TOはファイルのinode番号を見ているようでした。(たぶん、でもきっとそう)

inode番号はディレクトリやファイルが、ファイルの内容とは別に持っている情報です。

cpコマンドの場合、ファイルをコピーした時にコピー先のファイル名が存在しなければ新しいinodeのファイルを作ります。しかし、コピー先のファイル名が存在する場合は内容だけを書き換えてinode番号は変わりません。

そのためMOVED_TOでは検知できませんでした。

一方で、mvはinodeも含めてファイルを上書きします。

inode番号が更新されるのでMODED_TOで検知できていたようです。

原因が知れて満足。

オチ

そもそもcpでもmvでも対応したいなら、ファイルの変更を感知するMODIFYを使えばいいっぽいです。

コメント

タイトルとURLをコピーしました