inotifyを使用して、ディレクトリ全体を監視せずに特定のファイルが作成されるのを監視できますか?


9

特定のファイル名が作成されたときに通知を受け取りたい。私は見ていinotifyます。IN_CREATEフラグは、その中のすべての変更のためのディレクトリを監視するための利用可能ですが、私は、私が興味を持っていたファイル以外にも、そのディレクトリに活動の良い取引があるかもしれないので、ディレクトリ全体を監視することがないことを好むだろう。これを行うことができます?


3
答えは「いいえ」だと思います。少なくともinotifyではできません。ファイルの場所を制御できる場合は、そのためだけの特別なディレクトリを作成することをお勧めします。これにより、気が散ることに目が覚めることなくディレクトリを監視できます。あなたが場所を制御することができない場合、あなたはあなたのファイルの(相対)名、または他の呼び出しのようなものに対して返された「名前」フィールドを比較するのいずれかに直面しているaccessF_OK、それはまだ存在しているかどうかを確認します。
BobDoolittle

回答:


7

カーネルに特定のパスへの変更を通知するだけにすることはできません。理由は少し微妙です:

  • Linuxでは、ファイルオブジェクトは、その名前とは無関係に存在します。ファイルの名前は実際にはそれらを含むディレクトリの属性であり、単一のファイルが複数の名前で呼び出される場合があります(ハードリンクを参照)。

  • カーネルには、inotifyオブジェクトをアタッチするものが必要です。パス名は実際のファイルシステムオブジェクトではないため、オブジェクトをパス名にアタッチできません。親ディレクトリまたはパスが示すファイルに添付する必要があります。ただし、ファイルに添付することはできません。特定のファイルを変更するのではなく、特定の名前のファイルが作成されるかどうかを監視しているためです。

理論的には、カーネルは、ウォッチをディレクトリに追加するときに特定のパス名のイベントを選択できるAPIを実装できます。これは、イベントのタイプを選択できるのとほぼ同じです。これはAPIを膨らませ、最終的にカーネルは同じデータを処理し、ユーザー空間で行うのと同じ文字列比較を行います。

非常にアクティブなディレクトリにウォッチを配置すると、パフォーマンスに顕著な影響はありますか?あなたがどれほど活発であるかわかりません。毎秒数十のファイル、数百、数百万?

いずれにせよ、私は避けたいと思いaccessます:それは常にレースになるでしょう。への呼び出しの間にファイルが作成および削除される可能性があり、非常にタイトなループでのaccess呼び出しaccessは遅くなり、inotify解決するように設計された種類の問題です。


「特定のパスへの変更」が通知されない場合、inotifyはどのように機能しますか?あなたはおそらくファイルパスを具体的に参照していますが、ディレクトリパスを参照していませんか?
BobDoolittle

また、ユーザースペースではなくカーネルでチェックを行う利点は、ディレクトリを監視しているプロセスが複数ある場合です。それらを不必要にすべてコンテキスト切り替えして、すべてに比較を行わせる代わりに、問題のファイルパスを実際に気にするプロセスに切り替えるだけで済みます。
BobDoolittle 2016

つまり、ディレクトリ(明らかにパスで指定されます)を監視する場合、指定された名前のイベントのみを選択するようにカーネルに指示することはできません(そのため、「ファイル」パスを参照しています)。たくさんのプロセスを起こさないことの理論的な利点は理解していますが、を使用してみたinotifyかどうか、パフォーマンスが実際に問題だったかどうかをもう一度尋ねる必要があります。
Dylan Frese

1
あるいは、多くのプロセスが特定のイベントに関心がある場合、1つのプロセスでファイル名を監視し、UNIXソケットのようなものを介して「興味深い」イベントを、これらのイベントに実際に関心のあるプロセスに(一種のサービスとして)送信できます。
Dylan Frese

パフォーマンスの問題は、測定および診断が非常に困難な場合があります。レンガの壁に足を踏み入れるのではなく、まずは優れたプログラミング手法を採用し、優れた設計パターンを使用するソフトウェアを開発し、そのような状況を回避することを好みます。いいえ、問題はありませんでした。私は潜在的な問題を予測し、今後問題が発生する可能性があるため、この場合はinotifyの使用を避けました。私自身もシステムソフトウェア開発者として、人々がパフォーマンスの問題を回避するのに役立つ堅牢なメカニズムを提供することを信じています。これがinotifyの目的です。
BobDoolittle 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.