创建一个命名管道/fifo,在读取时执行命令

创建一个命名管道/fifo,在读取时执行命令

我希望提供一个仅从本地文件读取 http URL 内容的进程。该进程是一个守护进程,它被硬编码为读取当前工作目录中的特定文件,并在特定事件发生时读取它。

我无法控制触发文件读取的事件,我想提供近乎实时的数据,而不是通过curl 脚本不断将数据转储到文件中。

我认为可行的是一个 fifo,只要它被读取就执行命令。然后,它将连接到 netcat 或 curl 以检索 URL 的内容(xml 数据)。这可能吗?

答案1

在普通文件系统上不可能从管道启动进程进行读取。但还有其他方法可以满足您的需要。

您可以循环运行内容生成程序。每次打开 FIFO 进行写入时,都会阻塞,直到有读取器出现为止。

while true; do
  generate-content >fifo
done

另一种方法是制作一个保险丝生成任何你喜欢的内容的文件系统——返回给阅读器的数据是由文件系统驱动程序生成的,这是一个普通的程序,所以你可以让它做任何你喜欢的事情。构建 FUSE 文件系统驱动程序需要大量工作,所以除非您找一个这已经完全满足了您的需要,这可能有点矫枉过正。一些可能对您有帮助的文件系统是:

  • 脚本文件系统— 从描述来看,这正是您所需要的:“复制本地文件系统,但通过执行结果替换所有检测为‘脚本’的文件”。我从来没有用过它。
  • HTTPFS— 从文件中读取会触发网络下载;将其连接到本地主机并运行一个小型网络服务器,例如轻量级或者thttpd支持 CGI 或类似的方法来提供动态内容。如果您需要的数据已经从网络服务器下载,只需将 HTTPFS 指向它即可。

相关内容