如何减慢管道中的第一个程序,直到准备好第二个程序

时间:2019-06-01 20:26:07

标签: linux bash pipe

我有一个正在运行的脚本:

cat in | prog1 2>log1 | prog2 2>log2 | prog3 2>log3 > out

<in>可以有数百万行,我希望每个程序仅在消耗下一个程序STDOUT时在STDIN上产生输出。

这是因为prog1使用的系统资源prog2完成后将清除。

因此,基本上,我希望cat在写入行之间“暂停”,直到prog1占用了所述行,然后向下移动该行。

我尝试使用stdbuf,但似乎没有任何效果,即:

stdbuf -o0 cat in | stdbuf -o0 -i0 prog1 2>log1 | stdbuf -o0 -i0 prog2 2>log2 | stdbuf -o0 i0 prog3 2>log3 > out

在每个管道之间使用pv -l可以确认速度差异以及不同日志文件的tail -f

有没有办法做到这一点?

我知道这会对性能产生不利影响。

PS,我还希望在任何程序退出时退出整个管道,并且每个程序都是用perl或python编写的旧版程序,因此不能将它们组合在一起。

谢谢!

1 个答案:

答案 0 :(得分:1)

您为什么坚持使用管道?管道数据的全部要点是“先进先出”。如果要使用受限制的进程,请使用临时文件。

prog1 < in 2>log1 > $(mktemp)
prog2 < $_ 2>log2 > $(mktemp)
# etc...

edit:在这种情况下,$_的意思是“最后一个命令行的最后一个参数”。