web-dev-qa-db-ja.com

tail -f、ポーリングを使用しない

Node.jsを使用してファイルをテールする最もパフォーマンスの高い方法を探しています。

これを行うライブラリはいくつかありますが、ファイルの変更をチェックする間隔を要求するため、ポーリングを使用しているようです。

Tail -fを実行するプロセスを生成し、そのプロセスをstdoutから読み取ることができるかどうか疑問に思っています。 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
Alexander Mills

Linuxでは、GNU coreutilsバージョンのtailinotify を使用して、ファイルへの変更の待機をブロックします。FreeBSDでは、tailkevent を使用して同じことを行います。これは、変更を繰り返しチェックしてスリープするよりも優れています。これを行う必要がある頻度と変更が発生する頻度に応じて、価値がある場合とない場合があります。 tailを呼び出すためだけにnode.jsから外部プロセスを生成する問題。

LinuxまたはFreeBSD(またはMacOS?)を使用していない場合、tailユーティリティは、チェックとスリープを繰り返してJavaScriptで直接実行できるものよりも優れているとは言えません。

あるいは、LinuxまたはFreeBSDを使用している場合は、プロセスを生成せずに、何らかの拡張機能/プラグイン/モジュールを使用して、node.jsから直接inotifyまたはkeventを使用できる場合があります。それが存在するかどうかはわかりません。

6
Celada