fswatch
指定されたファイルまたはディレクトリの内容が変更されたときに通知を受け取るファイル変更モニターです。 fswatch
いくつかのモニターを実装します。
stat (2)
が使用できる場所であればどこでも機能します)。 fswatch
前述の API のいずれかを搭載しているシステム上で正しく構築され、動作する必要があります。
fswatch
、C および C++ バインディングを備えたライブラリであるlibfswatch
のフロントエンドです。 libfswatch
の詳細については、ここを参照してください。
fswatch
主な機能は次のとおりです。
fswatch
の制限は、使用されているモニターに大きく依存します。
FSEventsモニターは macOS でのみ利用可能ですが、既知の制限はなく、監視されているファイルの数に合わせて非常によく拡張できます。
Solaris カーネルおよびその派生製品で使用できるファイル イベント通知モニターには、既知の制限はありません。
kqueueモニターは、kqueue を備えた *BSD システムで利用でき、監視されているすべてのファイルに対してファイル記述子を開く必要があります。その結果、このモニターは観察されるファイルの数に応じてうまく調整できず、 fswatch
プロセスがファイル記述子を使い果たすとすぐに誤動作を開始する可能性があります。この場合、 fswatch
開けないファイルごとに標準エラーで 1 つのエラーをダンプします。
inotifyモニターは、Linux カーネル 2.6.13 以降で利用可能ですが、イベントがキューから読み取られるよりも早く生成されると、キュー オーバーフローが発生する可能性があります。いずれの場合も、アプリケーションは、正常に回復するために処理できるオーバーフロー通知を受け取ることが保証されています。 fswatch
現在、キューのオーバーフローが発生した場合に例外をスローします。将来のバージョンでは、適切な通知を発行することでオーバーフローを処理する予定です。
Windowsモニターは監視ディレクトリのみを確立でき、ファイルは確立できません。ファイルを監視するには、ディレクトリのすべての子の変更イベントを任意の深さで再帰的に受信するために、その親ディレクトリを監視する必要があります。必要に応じて、変更イベントをフィルタリングして、目的のファイルへの変更のみを含めることができます。
ポーリングモニターはどのプラットフォームでも利用でき、そのタスクを実行するには利用可能な CPU とメモリのみに依存します。このモニターのパフォーマンスは、監視されているファイルの数に応じて直線的に低下します。
使用上の推奨事項は次のとおりです。
macOS では、 FSEvents
モニターのみを使用します (これがデフォルトの動作です)。
Solaris およびその派生製品では、ファイル イベント通知モニターを使用します。
Linux では、 inotify
モニター (デフォルトの動作) を使用します。
監視するファイルの数が十分に少ない場合は、 kqueue
モニターを使用します。一部のシステムでは、オペレーティング システムでさらに大きな値が許可されている場合でも、プロセスで開くことができるファイル記述子の最大数が非常に低い値に設定されていることに注意してください (256 という低い値も珍しくありません)。この場合、OS のドキュメントを確認して、プロセスごとまたはシステム全体のいずれかでこの制限を引き上げてください。
可能であれば、ファイルではなくディレクトリを監視します。イベントの受信側を適切に作成してディレクトリを処理すると、モニター リソースの消費が大幅に削減される可能性があります。
Windows では、 windows
モニターを使用します。
上記のいずれにも当てはまらない場合は、ポーリング モニターを使用してください。著者の経験によれば、最小パス長が 32 文字の 500,000 ファイルの階層を観察するには、 fswatch
は約 150 MB の RAM メモリが必要です。ポーリング モニターの一般的なボトルネックはディスク アクセスです。これは、多数のファイルをstat()
で実行すると膨大な時間がかかる場合があるためです。この場合、頻繁なディスク アクセスによるパフォーマンスの低下を軽減するために、レイテンシーを十分に大きな値に設定する必要があります。
通常のユーザーは、OS またはサードパーティのパッケージ マネージャーからfswatch
取得できる場合があります。 macOS 用のfswatch
を探している場合は、MacPorts または Homebrew を使用してインストールできます。
# MacPorts
$ port install fswatch
# Homebrew
$ brew install fswatch
FreeBSD では、pkg を使用してfswatch
インストールできます。
# pkg install fswatch-mon
お気に入りのパッケージ マネージャーを確認し、そこにfswatch
がない場合はお知らせください。
fswatch
を構築したいユーザーは、リリース tarball を入手する必要があります。リリース tarball には、ユーザーがシステム上でfswatch
構築するために必要なものがすべて含まれており、以下の「インストール」セクションとINSTALL
ファイルで詳しく説明されている手順に従います。
fswatch
変更したい開発者は、(ソース tarball またはリポジトリのクローン作成のいずれかから) ソースを取得し、マシンに GNU Build System をインストールする必要があります。マシン上のソースからfswatch
ブートストラップする方法の詳細については、 README.gnu-build-system
お読みください。
開発者であり、マシンに GNU Build System がインストールされており、ソース上でブートストラップする方法を知っている場合を除き、ソース リポジトリのコピーを取得することはお勧めできません。
fswatch
構成およびインストール方法の詳細については、 INSTALL
ファイルを参照してください。 fswatch
動的ライブラリを構築して使用するため、プラットフォームによっては、 fswatch
使用する前に追加のタスクを実行する必要がある場合があります。
ダイナミック ライブラリのインストール ディレクトリ ( $PREFIX/lib
) が、オペレーティング システムのダイナミック リンカーのルックアップ パスに含まれていることを確認してください。デフォルトのパス/usr/local/lib
、ほぼすべてのオペレーティング システムで機能します。
動的ライブラリへのリンクとキャッシュの更新が必要になる場合があります。 GNU/Linux システムでは、 ldconfig
実行する必要がある場合があります。
$ ldconfig
fswatch
は C++ プログラムであり、これをコンパイルするには C++11 標準に準拠した C++ コンパイラが必要です。 C++ ツールチェーンと C++ ランタイムのインストール方法については、OS のドキュメントを確認してください。
fswatch
構成とインストールに他のソフトウェア パッケージや依存関係は必要ありませんが、ファイル システム モニターによって使用される前述の API が必要です。
fswatch
次のドキュメントを提供します。
fswatch
公式ドキュメントは Texinfo 形式で提供されます。これはfswatch
に関する最も包括的な情報源であり、唯一信頼できる情報源です。特に、マニュアル ページは、代わりに情報ページを使用することをユーザーに提案するスタブです。
パッケージ マネージャーを使用してfswatch
インストールしており、PDF マニュアルをパッケージにバンドルしたい場合は、パッケージ メンテナーに機能リクエストを送信してください。
fswatch
ローカライズ可能で、内部的に GNU gettext
使用してローカライズ可能な文字列を翻訳から切り離します。現在利用可能なロケールは次のとおりです。
en
)。it
)。es
)。ローカリゼーション サポートを備えたfswatch
構築するには、システムにgettext
がインストールされている必要があります。 configure
を見つけられない場合、またはリンカーがlibintl
見つけられない場合は、通常はCPPFLAGS
とLDFLAGS
変数を使用して、 configure
にその場所を手動で指定する必要がある場合があります。例については、 README.macos
参照してください。
システムでgettext
が利用できない場合、 fswatch
正しく構築されますが、ローカリゼーション サポートがなく、利用可能なロケールは英語のみになります。
fswatch
変更イベントを受信する必要があるパスのリストを受け入れます。
$ fswatch [options] ... path-0 ... path-n
イベント ストリームは、パスがまだ存在しない場合でも作成されます。 fswatch
の起動後に作成された場合、変更イベントは適切に受信されます。使用されているウォッチャーに応じて、新しく作成されたパスは、設定された遅延時間が経過した後に監視されます。
fswatch
の出力を他のプログラムにパイプしてさらに処理することができます。
$ fswatch -0 path | while read -d "" event
do
// do something with ${event}
done
一連の変更イベントが標準出力に出力されるが、イベントの詳細は必要ないときにコマンドを実行するには、次のコマンドを使用できます。
$ fswatch -o path | xargs -n1 -I{} program
この動作は、 fswatch
の以前のバージョン (v. 0.x) と一致しています。詳細については、 「fswatch v. 0.x との互換性の問題」セクションをお読みください。
デフォルトでは、 fswatch
パフォーマンスとリソース消費の観点から、現在のプラットフォームで利用可能な最適なモニターを選択します。ユーザーが別のモニターを指定したい場合は、 -m
オプションを使用してモニターを名前で指定できます。
$ fswatch -m kqueue_monitor path
使用可能なモニターのリストは、 -h
オプションを使用して取得できます。
詳細については、 fswatch
ドキュメントを参照してください。
誰でもfswatch
に貢献することを歓迎します。詳細については、 CONTRIBUTING
を参照してください。
バグレポートは作成者に直接送信できます。
作者には、Freenode #fswatch
チャネルを使用して IRC で連絡できます。
このソフトウェアは、GPL v. 3.0 と Apache License v. 2.0 に基づいて二重ライセンスされています。
著作権 (c) 2013-2021 エンリコ M. クリソストモ
このプログラムはフリーソフトウェアです。 Free Software Foundation によって公開されている GNU General Public License の条件に基づいて、再配布したり変更したりすることができます。バージョン 3、または (オプションで) それ以降のバージョンのいずれかです。
このプログラムは役立つことを期待して配布されていますが、いかなる保証もありません。商品性や特定目的への適合性についての暗黙の保証もありません。詳細については、GNU 一般公衆利用許諾書を参照してください。
このプログラムと一緒に GNU 一般公衆利用許諾書のコピーも受け取っているはずです。そうでない場合は、http://www.gnu.org/licenses/ を参照してください。