Linux里output没有文件,关于linux:使用无缓冲管道作为“虚拟”文件输出

我一直在处理一个我无法找到解决方法的奇怪问题。

我的情况如下。

我在python中有一个名为"app1"的应用程序,它需要一个文件来输出它执行的结果。

我有一个名为"app2"的辅助应用程序;二进制文件,从stdin获取输入。

我想管道"app1"直接生成"app2"进行处理,在理想情况下会是这样的:

app1 | app2

但是,正如我所说,有一些限制,比如app1需要一个文件作为输出。

我发现"愚弄"app1输出到stdout的第一个解决方案是使用mkfifo并创建一个管道,所以我可以将它管道输入到app2中的stdin。像这样:

pipe='/tmp/output_pipe'

mkfifo"$output_pipe"

python app1 -o"$output_pipe" &

app2 < $tmp_pipe

问题是最终,在执行期间,app1将产生比app2作为输入处理的输出更多的输出,并且由于管道上的缓冲区大小限制,管道将填满并且一切都将停止工作。

然后我使用了另一种方法:

python app1 -o /dev/stdout | app2

但情况与stdout也有缓冲区大小限制相同。

任何人都知道如何解决这个特定的情况?

TL; DR:我需要一个"虚拟"文件,它将作为标准输出,但没有管道的标准尺寸限制。

听起来你有一个需要解决的死锁问题。 创建更大的管道不是最佳解决方案。

特别是,"管道将填满,一切都将停止工作"的说法没有多大意义。 如果管道填满,则app1将阻止写入,但app2应继续工作。 当它清除管道中的数据时,app1将开始写入更多数据。 除非你有其他的僵局,否则你没有描述。

我的推论是因为如果我尝试使用缓冲管道,运行几个小时后,app2将停止工作。 如果我使用无缓冲管道(如stderr),应用程序会持续运行数小时而不会出现问题。 这是我(可能是错误的)扣除的唯一原因。

有几个utils旨在处理类似的情况:

buffer:python app1 -o /dev/stdout | buffer | app2

stdbuf:python app1 -o /dev/stdout | stdbuf app2

unbuffer:python app1 -o /dev/stdout | unbuffer app2

mbuffer(buffer有更多选项):python app1 -o /dev/stdout | mbuffer | app2

bash进程替换:python app1 -o >(app2)

utils有各种选项,其中一些可能是必需的(取决于app1和app2正在做什么)。某些选项设置缓冲区的大小,或添加延迟,或显示诊断信息。

Pixelbeat.org有一些图表可以帮助可视化缓冲的工作原理(或失败)。

另外这里有一个socat技巧,但我不太确定它的作用......

好。我的错。

有些人在这里建议,这不是缓冲问题。

这是一个CPU上限问题。这两个应用程序在运行时消耗100%的CPU和RAM,这就是应用程序崩溃的原因。

你有几个选择:

使用文件。消费者从文件中读取文件并从"tail -f"代码中实现文件,而不是从stdin读取

编写管道缓冲程序。这个选项有点愚蠢但是如果你不能改变其他任何一个都可以。我刚才在Perl写了一个,抱歉不能分享它,但基本上使用非阻塞IO从管道读取并写入管道,将所有数据保存在内存中。如果内存使用率过高,可能很难记录投诉。

修改读取器或写入器以使用非阻塞IO并缓冲输出或输入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值