Node.js 通过 scp 监视传入存档的目录

Node.js watch a directory for incoming archive by scp

我的任务是创建一个 node.js 脚本,该脚本在目录中侦听新存档文件是否到达并处理它们。

我发现我可以用 fs.watch 做到这一点。

这些文件是 tar.gz 个档案,通过 scp 到达。

问题是新存档文件的到来似乎在文件系统中创建了多个(确切数量不可预测)事件。第一个是 rename,然后是一些 change 事件。

我只需要在存档传输完成时可靠地触发我的处理逻辑一次。如何做到这一点?

补充说明:

使用手表库你可以做:

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

我建议您利用丰富的图书馆生态系统,因为您使用的是节点平台。其中一些问题已经为您解决!

问题是文件传输不是即时的;您观察到的一系列事件完全有道理:

  1. 有人开始上传文件。 scp 服务器创建一个新文件。您的观察者看到了 rename 事件。
  2. 字节已发送到您的服务器。 scp 服务器将它们写入步骤 1 中的文件。您的观察者看到许多 change 事件。
  3. 上传完成。不会生成更多事件,因为所有字节都已写入。

据我所知(基于略读 the source of scp),无法配置 scp 服务器在上传实际完成时执行某些操作。这给您留下了两个选择:

  • 去抖 change 事件。这意味着每次收到 change 事件时设置一个计时器并清除前一个计时器。最终,您将停止获取事件,计时器将触发,您可以假设上传已完成。

    这确实会让您容易受到停滞或中止上传的影响。

  • 您可以实现自己的 scp 服务器。 This gives a good overview of how the protocol works. 远程 scp 只是打开一个 ssh 连接并运行主机的 scp 命令,然后它有一个简单的文件传输协议。您必须将服务器的 scp 替换为您自己的实现。

    由于协议会告诉您预期的字节数,因此您会确切知道何时收到完整文件并可以开始处理。