Node.js 通过 scp 监视传入存档的目录
Node.js watch a directory for incoming archive by scp
我的任务是创建一个 node.js 脚本,该脚本在目录中侦听新存档文件是否到达并处理它们。
我发现我可以用 fs.watch
做到这一点。
这些文件是 tar.gz
个档案,通过 scp
到达。
问题是新存档文件的到来似乎在文件系统中创建了多个(确切数量不可预测)事件。第一个是 rename
,然后是一些 change
事件。
我只需要在存档传输完成时可靠地触发我的处理逻辑一次。如何做到这一点?
补充说明:
- 我无法更改发送存档的系统,只能
系统接收它。
- 我不考虑使用经过的时间
猜测scp事件已经结束。那是不靠谱的。
使用手表库你可以做:
var watch = require('watch')
watch.createMonitor('/home/path', function (monitor) {
monitor.on("created", function (file, stat) {
// do work with new file
})
}
我建议您利用丰富的图书馆生态系统,因为您使用的是节点平台。其中一些问题已经为您解决!
问题是文件传输不是即时的;您观察到的一系列事件完全有道理:
- 有人开始上传文件。 scp 服务器创建一个新文件。您的观察者看到了
rename
事件。
- 字节已发送到您的服务器。 scp 服务器将它们写入步骤 1 中的文件。您的观察者看到许多
change
事件。
- 上传完成。不会生成更多事件,因为所有字节都已写入。
据我所知(基于略读 the source of scp),无法配置 scp 服务器在上传实际完成时执行某些操作。这给您留下了两个选择:
去抖 change
事件。这意味着每次收到 change
事件时设置一个计时器并清除前一个计时器。最终,您将停止获取事件,计时器将触发,您可以假设上传已完成。
这确实会让您容易受到停滞或中止上传的影响。
您可以实现自己的 scp 服务器。 This gives a good overview of how the protocol works. 远程 scp 只是打开一个 ssh 连接并运行主机的 scp
命令,然后它有一个简单的文件传输协议。您必须将服务器的 scp
替换为您自己的实现。
由于协议会告诉您预期的字节数,因此您会确切知道何时收到完整文件并可以开始处理。
我的任务是创建一个 node.js 脚本,该脚本在目录中侦听新存档文件是否到达并处理它们。
我发现我可以用 fs.watch
做到这一点。
这些文件是 tar.gz
个档案,通过 scp
到达。
问题是新存档文件的到来似乎在文件系统中创建了多个(确切数量不可预测)事件。第一个是 rename
,然后是一些 change
事件。
我只需要在存档传输完成时可靠地触发我的处理逻辑一次。如何做到这一点?
补充说明:
- 我无法更改发送存档的系统,只能 系统接收它。
- 我不考虑使用经过的时间 猜测scp事件已经结束。那是不靠谱的。
使用手表库你可以做:
var watch = require('watch')
watch.createMonitor('/home/path', function (monitor) {
monitor.on("created", function (file, stat) {
// do work with new file
})
}
我建议您利用丰富的图书馆生态系统,因为您使用的是节点平台。其中一些问题已经为您解决!
问题是文件传输不是即时的;您观察到的一系列事件完全有道理:
- 有人开始上传文件。 scp 服务器创建一个新文件。您的观察者看到了
rename
事件。 - 字节已发送到您的服务器。 scp 服务器将它们写入步骤 1 中的文件。您的观察者看到许多
change
事件。 - 上传完成。不会生成更多事件,因为所有字节都已写入。
据我所知(基于略读 the source of scp),无法配置 scp 服务器在上传实际完成时执行某些操作。这给您留下了两个选择:
去抖
change
事件。这意味着每次收到change
事件时设置一个计时器并清除前一个计时器。最终,您将停止获取事件,计时器将触发,您可以假设上传已完成。这确实会让您容易受到停滞或中止上传的影响。
您可以实现自己的 scp 服务器。 This gives a good overview of how the protocol works. 远程 scp 只是打开一个 ssh 连接并运行主机的
scp
命令,然后它有一个简单的文件传输协议。您必须将服务器的scp
替换为您自己的实现。由于协议会告诉您预期的字节数,因此您会确切知道何时收到完整文件并可以开始处理。