![创建一个实际上是网络端口的文件](https://linux22.com/image/55282/%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%AE%9E%E9%99%85%E4%B8%8A%E6%98%AF%E7%BD%91%E7%BB%9C%E7%AB%AF%E5%8F%A3%E7%9A%84%E6%96%87%E4%BB%B6.png)
我有一个程序在集群上运行,该程序的输出被写入我指定的日志文件中。但是,我不想将其写入文件,而是想将其写入网络端口,以便可以使用 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 的断开连接)来执行更健壮的操作。
(如果您可以修改程序以获得对基于套接字的日志记录的本机支持,则所有这些都是不必要的)。