3

以下を使用して、Ubuntu で NodeJS サーバーの構成ファイルを監視しています。

for( var index in cfgFiles ) {
    fs.watch(cfgFiles[index], function(event, fileName) {
        logger.info("======> EVENT: " + event);
        updateConfigData(fileName);
    });
}

そのため、構成ファイルを保存するたびに、同じファイル名のハンドラー関数によって「変更」イベントが少なくとも 2 回受信され、updateConfigData() が複数回実行されます。C++/iNotify を使用して構成ファイルを監視しているときに、同じ動作が発生しました。

この動作の原因を知っている人はいますか?

4

2 に答える 2

5

簡単な回答:ノードではありません。ファイルは実際には 2 回変更されています。

長い答え

私は開発セットアップに使用するアプローチと非常によく似ています。私のマネージャー プロセスは、開発マシンの場合はすべての js ソース ファイルを監視し、クラスターで子を再起動します。

これは単なる開発セットアップだったので、これには注意を払っていませんでした。しかし、あなたの質問を読んだ後、私はそれを見て、私が同じ行動をしていることに気付きました.

ローカル コンピューターでファイルを編集し、保存するたびにエディターが sftp 経由でファイルを更新します。保存するたびに、ファイルの変更イベントが 2 回トリガーされます。

fs.watch 呼び出しによって返される FSWatcher オブジェクトの listeners('change') を確認しました。しかし、それは私のイベントハンドラーを一度だけ表示します。

次に、最初に実行する必要があったテストを実行しました。サーバーで「touch file.js」を実行すると、一度だけトリガーされました。したがって、私にとってはノードではありませんでした。しかし、ファイルは実際には2回変更されました。ファイルが(追加ではなく)書き込み用に開かれると、コンテンツが空になるため、おそらく変更がトリガーされます。その後、新しいコンテンツが書き込まれると、もう一度イベントがトリガーされます。

これは私にとって何の問題も引き起こしません。しかし、それを防ぎたい場合は、各ファイルの呼び出し番号を保持することにより、イベント ハンドラー関数で奇偶制御を作成し、偶数インデックスの呼び出しに対してのみ行うことを行うことができます。

于 2012-07-04T17:26:40.737 に答える