tail -f,不使用轮询

Ale*_*lls 1 tail

我正在寻找使用 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)

但我想知道是否有更有效的方法来做到这一点

Cel*_*ada 6

在 Linux 上,GNU coreutils 版本tail使用inotify来阻止等待更改文件。在 FreeBSD 中,tail使用kevent来做同样的事情。这比反复检查变化和睡眠要好。根据您需要执行此操作的频率以及发生更改的频率,从 node.js 生成外部进程只是为了调用tail.

如果您不使用 Linux 或 FreeBSD(或可能是 MacOS?),该tail实用程序可能并不比您可以通过重复检查和睡眠直接在 JavaScript 中执行的操作更好。

或者,如果您使用 Linux 或 FreeBSD,您可以使用inotifykevent直接从 node.js 使用某种扩展/插件/模块,而无需生成进程。我不知道这是否存在。

  • FreeBSD `tail` 当然使用 `kevent()`。(-: 使用`-f` 等待文件长度更改。使用`-F` 等待文件长度更改、文件删除和文件重命名。 (2认同)