2016-05-13 13 views
1

新しいアーカイブファイルが到着して処理されるディレクトリをリッスンするnode.jsスクリプトを作成するタスクがあります。Node.js scpで受信アーカイブのディレクトリを監視

私はfs.watchでこれを行うことができます。

ファイルがscpを経由して到着したtar.gzアーカイブです。

問題は、新しいアーカイブファイルの到着は、ファイル・システム内の複数の(正確な数は予測不可能である)イベントを作成するようだということです。最初はrenameであり、続いていくつかの数がchangeイベントです。

アーカイブの転送が完了すると、処理ロジックを確実に1回だけ確実にトリガーする必要があります。これはどうすればできますか?

その他の注意事項:

  • 私はアーカイブ、それを受け取るだけ システムを送るシステムに変更を加えることができないのです。
  • 私は、 までの経過時間の使用を検討していないため、scpイベントが終了したと推測されます。それは信頼できません。

答えて

3

あなたが行うことができます時計のライブラリを使用して:あなたはノードのプラットフォームを使用しているので、私はあなたに利用できる豊富なライブラリのエコシステムを活用することをお勧めします

var watch = require('watch') 
watch.createMonitor('/home/path', function (monitor) { 
    monitor.on("created", function (file, stat) { 
     // do work with new file 
    }) 
} 

。これらの問題のいくつかはすでにあなたのために解決されています!

+0

非常にクールです。私はこのライブラリを知らなかった。チップのおかげで –

+1

これは実際には問題を解決していません - 時計モジュールは単に 'fs.watch'をラップします。 'created'イベントは、既に観測された' rename'イベントOPに直接相当します。同じ問題が発生した直後です。 – josh3736

+0

私もそう思っていましたが、ファイルごとに1つのイベントしか生成していないようです。 –

1

ファイル転送は瞬間的ではないという問題があります。あなたが観察した一連の出来事は完全な意味を成しています:

  1. 誰かがファイルのアップロードを開始します。 scpサーバーは新しいファイルを作成します。ウォッチャにはrenameイベントが表示されます。
  2. バイトがサーバーに送信されます。 scpサーバーは、それらをステップ1のファイルに書き込みます。ウォッチャーは、多くのchangeイベントを検出します。
  3. アップロードが完了しました。すべてのバイトが書き込まれているため、それ以上のイベントは生成されません。限り私が知っている(とthe source of scpをスキミングに基づく)として

、アップロードが実際に完了したときに何かをするSCPサーバを設定する方法はありません。これにより、2つのオプションがあります。

  • イベントをデバウンスchangeで討議してください。これは、changeイベントを取得し、前のタイマーをクリアするたびにタイマーを設定することを意味します。最終的には、イベントの取得を停止し、タイマーが起動し、アップロードが完了したとみなすことができます。

    これは、あなたが停止したアップロードやアボートされたアップロードの操作に脆弱になります。

  • 独自のscpサーバーを実装できます。 This gives a good overview of how the protocol works.リモートscpは単にssh接続を開き、ホストのscpコマンドを実行します。このコマンドは、ファイル転送用の単純なプロトコルを持っています。サーバーのscpを独自の実装に置き換える必要があります。

    プロトコルでは、予想されるバイト数がわかるため、完全なファイルを受信した時点を正確に把握して処理を開始できます。

関連する問題