クラスタで実行されるプログラムがあり、プログラムの出力が私が指定したログファイルに書き込まれます。ところで、ファイルに書き込むのではなく、Node.jsなどを利用して読めるようにネットワークポートに書きたいと思います。
たとえば、/dev/127.0.0.1:3000行でファイルを指定できるようにしたいとします。
現在私はNode.jsを使用してログファイルを監視し、データが変更された場合はすべてのデータを再読み込みし、新しいデータと古いデータを比較して追加された内容を確認して処理します。しかし、これはかなり非効率的です。
ベストアンサー1
プログラムがファイルを再生成せずに(ファイルを開いて)書き込む場合は、ファイルをパイプとして生成してこれを実行できます。
mkfifo potato.log
ファイルに書き込むのと同じように、パイプにメッセージを送信できます。
$ # This is the logging process:
$ echo "Warning!" > potato.log
そして読んでください:
$ # This is the listener process:
$ cat potato.log
Warning!
実際にTCPソケットに渡すには、次のようにします。
$ socat PIPE:potato.log TCP:localhost:3000
非常に強力ではないかもしれませんが、socat(リモートTCPとの切断を処理する)の代わりにプログラムを書くことで、より強力なタスクを実行できます。
(ソケットベースのロギングの基本的なサポートを得るためにプログラムを変更できる場合は、これはすべて必要ありません。)