假设您有一个如下所示的管道:
$ a | b
如果b停止处理标准输入,一段时间后管道填满,并从a标准输出写入,将阻塞(直到b再次开始处理或死亡)。
如果我想避免这种情况,我可能会尝试使用更大的管道(或更简单地说,buffer(1)),如下所示:
$ a | buffer | b
这只会为我争取更多时间,但最终a会停止。
我想要的(对于我正在解决的一个非常具体的场景)是有一个“泄漏”的管道,当它满了时,会从缓冲区中删除一些数据(理想情况下,逐行)让我们a继续处理(正如您可能想象的那样,在管道中流动的数据是可消耗的,即处理数据b不如a能够无阻塞地运行重要)。
总而言之,我希望有一个像有界的、泄漏的缓冲区之类的东西:
$ a | leakybuffer | b
我可能可以用任何语言很容易地实现它,我只是想知道是否有我遗漏的“准备使用”(或类似 bash one-liner 之类的东西)。
注意:在示例中我使用的是常规管道,但该问题同样适用于命名管道
虽然我给出了下面的答案,但我也决定实施leakybuffer 命令,因为下面的简单解决方案有一些限制:https : //github.com/CAFxX/leakybuffer
有没有办法设置 Bash(或其他 shell)脚本中定义的管道的管道容量?以例如
cmd1 | cmd2
在最近的 Linux 中,管道容量默认设置为 64KB。我知道我可以通过两种方式控制两个进程之间“缓冲”的数据量:
buffer(1):例如cmd1 | buffer | cmd2fcntl(2)与F_SETPIPE_SZ标志一起使用cmd1cmd2每种方案都有缺点:buffer只能用于增加缓冲区;还覆盖默认管道容量仍需要唤醒下游命令。fcntl,据我所知,只能从内部cmd1或cmd2.
我的问题是:有没有办法在外壳创建管道时在外壳中指定管道应该具有多少容量?