2

I'm looking to supply a process that only reads from a local file with content from an http URL. The process is a daemon that is hard-coded to read a specific file in it's current working directory and reads it whenever a particular event happens.

I have no control over the event that triggers the file read and I want to supply near real time data instead of constantly dumping data via a curl script to the file.

What I thought might work would be a fifo that executes a command whenever it is read. This would then be connected to netcat or curl to retrieve the contents of the URL (xml data). Is this possible?

1 Answers1

5

It's impossible to make reading from a pipe launch a process on a normal filesystem. But there are other methods that should do what you need.

You can run the content-generating program in a loop. Each time the FIFO is opened for writing, this will block until a reader comes along.

while true; do
  generate-content >fifo
done

Another approach is to make a FUSE filesystem that generates whatever content you like — the data returned to the reader is generated by the filesystem driver, which is an ordinary program, so you can make it do whatever you like. Building a FUSE filesystem driver is a lot of work though, so unless you find one that already does exactly what you need this is probably overkill. Some possible filesystems that may help you are:

  • ScriptFS — judging by the description, this does exactly what you need: “replicates a local file system, but replaces all files detected as ‘scripts’ by the result of their execution”. I've never used it.
  • HTTPFS — reading from the file triggers a web download; connect it to localhost and run a small webserver such as lighttpd or thttpd that supports CGI or a similar method to serve dynamic content. If the data you need is already downloaded from a webserver, simply point HTTPFS at it.
  • It might not be (easily) possible to react to a fifo read (though flooding a pipe could work, maybe) but it would be possible with a serial line/terminal. screen could be setup to handle this, or SLIP and/or PPP (even SYNC_PPP) could be used - this is kind of what they're for, as I think. – mikeserv Jan 22 '15 at 02:32