有没有办法实现像 /proc 文件系统中的“文件”一样工作的自定义文件?

Bar*_*den 6 fifo

我正在寻找诸如持久命名管道之类的东西……我可以多次 cat 或 grep 的东西,并且始终获取正在输入管道的任何进程的当前状态。

例如,假设我创建了一个名为 的命名管道/tmp/timestamp,然后使用date它来写入:

mkfifo /tmp/timestamp
date --iso-8601=seconds > /tmp/timestamp
Run Code Online (Sandbox Code Playgroud)

此时,调用date将阻塞,等待/tmp/timestamp被读取......

cat `/tmp/timestamp`
Run Code Online (Sandbox Code Playgroud)

将 un-block date,我会看到类似2017-03-18T16:11:54-04:00写入 stdout 的内容,date并将终止。

...但是如果我每次都想要更新日期怎么cat /tmp/timestamp办?

我猜可能是

while :; date --iso-8601=seconds > /tmp/timestamp; done
Run Code Online (Sandbox Code Playgroud)

会起作用,但我想知道 a) 这种方法是否存在任何不明显的问题,以及 b) 是否有一种不需要循环的方法。

我还想设置它以便它自动启动,使 fifo 始终可用。

就我为什么要将其放入管道而言 - 有问题的信息存储在支持 Web 应用程序的数据库中。我们的大多数技术支持人员完全习惯于通过 ssh 登录服务器并对数据库运行查询,但是有一些重要的统计数据对于简单地从文件中 grep非常方便。能够访问ls包含命名管道的目录将使所有这些都可以被发现......本质上,我这样做不是因为我必须这样做,我这样做是因为我认为这是一个很好的比喻。

Dav*_*ing 2

这是循环的一个“不明显的问题”:如果读取进程保持 fifo 打开(因为,比如说,它在打开另一个文件时阻塞或被挂起),则写入循环将连续运行(直到它填满 fifo 缓冲区) 。多个并发读取器也存在问题,但也许您可以合理地消除这种可能性。

至于非循环解决方案,您可以使用套接字而不是 fifo,但是您必须编写一个(简单的)读取器程序(如果您想运行除 之外的其他程序,请使用管道cat),因为您不能只使用open这些。