我正在寻找使用 Node.js 拖尾文件的最高效方法。
有一些库会这样做,但它们似乎使用轮询,因为它们要求间隔检查文件更改。
我想知道我是否可以生成一个执行 tail -f 的进程并从标准输出中读取该进程。有谁知道 linux 机器上的 tail -f 命令是否使用轮询,或者它是否以某种方式挂钩到较低级别的可观察对象?tail -f 是如何工作的?
在 Node.js 中,我可以这样做:
const cp = require('child_process');
module.exports = function(file){
const n = cp.spawn('tail',['-f',file]);
n.on('error', function(err){
console.error(err.stack || err);
});
return n.stdout;
};
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有更有效的方法来做到这一点
在 Linux 上,GNU coreutils 版本tail
使用inotify来阻止等待更改文件。在 FreeBSD 中,tail
使用kevent来做同样的事情。这比反复检查变化和睡眠要好。根据您需要执行此操作的频率以及发生更改的频率,从 node.js 生成外部进程只是为了调用tail
.
如果您不使用 Linux 或 FreeBSD(或可能是 MacOS?),该tail
实用程序可能并不比您可以通过重复检查和睡眠直接在 JavaScript 中执行的操作更好。
或者,如果您使用 Linux 或 FreeBSD,您可以使用inotify
或kevent
直接从 node.js 使用某种扩展/插件/模块,而无需生成进程。我不知道这是否存在。