非阻塞缓冲命名管道?

T.J*_*der 24 pipe io-redirection

我正在寻找我怀疑不存在的东西:从命令行使用的非阻塞缓冲命名管道 (fifo)。有这样的事情吗?

这是用例:假设我有一个进程将在后台运行很长时间并将大量输出输出到stdout. 我并不真正关心输出,也不想存储它(也许我没有足够的空间),但我想定期“加入”并关注它在做什么,然后再次退出让它去做它的工作。所以我想将它的输出重定向到这个理论上的缓冲的、非阻塞的命名管道,然后定期访问它。

所以基本上我想这样开始(10M缓冲区的大小):

mkmagicfifo magicfifo 10M
spewingprocess > magicfifo &
Run Code Online (Sandbox Code Playgroud)

......并定期访问看看发生了什么......

tail -f magicfifo
Run Code Online (Sandbox Code Playgroud)

... magicfifo存储所有输出(因此,不是普通文件),并且在它填满且未被点击时不会阻塞喷出过程(因此,不是一个普通的命名管道)。

我不认为解决方案涉及tailprune不会这样做(好吧,我可以想到一个涉及的解决方法tail),因为tail仍然需要我将所有数据存储在某处(如果我想进入并退出查看它),并且prune必须重写文件,大概(我承认我没有尝试/证明这一点)破坏了生成所有输出的过程的重定向。

我希望我可以编写一些实用程序来做到这一点,但是 *nix 有很多很酷的文件和管道方面的东西,我不禁认为它存在,我只是不知道它。

那么:有没有这样的事情,如果有的话是什么?

psu*_*usi 16

我认为您正在寻找的是 GNU screen。它维护一个缓冲区,用于保存一个或多个程序的最后一个或两个输出的完整屏幕,并让您断开连接并稍后返回。

  • 还有`tmux` 和`dtach` —— 同类型的终端多路复用器/会话管理器应用程序中的任何东西都应该能够实现相同的功能。 (2认同)

Dav*_*rtz 5

您可以使用pv,它可以在管道中提供尽可能多的缓冲。你可以这样使用它:

sprewingprocess | pv -B 1g > ordinaryfifo &
Run Code Online (Sandbox Code Playgroud)

这将为您提供最多 1GB 的缓冲区spewingprocess和 fifo。pv信不信由你,大多数 Linux 发行版都提供了一个名为pv.