![tail -f,不使用轮询](https://linux22.com/image/101586/tail%20-f%EF%BC%8C%E4%B8%8D%E4%BD%BF%E7%94%A8%E8%BD%AE%E8%AF%A2.png)
我正在寻找使用 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;
};
但我想知道是否有更有效的方法来做到这一点
答案1
在 Linux 上,GNU coreutils 版本tail
使用inotify阻止等待文件更改。对于 FreeBSD,tail
使用克文特做同样的事情。这比反复检查变化和睡觉要好。根据您需要执行此操作的频率以及发生更改的频率,从 node.js 生成外部进程来调用 可能值得也可能不值得tail
。
如果您不使用 Linux 或 FreeBSD(或者可能是 MacOS?),该tail
实用程序可能并不比您可以通过重复检查和睡眠直接在 JavaScript 中执行的操作更好。
或者,如果您使用的是 Linux 或 FreeBSD,您可以使用inotify
或kevent
直接从带有某种扩展/插件/模块的 Node.js 中使用,而无需生成进程。我不知道这是否存在。