我有一个正在运行的脚本:
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编写的旧版程序,因此不能将它们组合在一起。
谢谢!
答案 0 :(得分:1)
您为什么坚持使用管道?管道数据的全部要点是“先进先出”。如果要使用受限制的进程,请使用临时文件。
prog1 < in 2>log1 > $(mktemp)
prog2 < $_ 2>log2 > $(mktemp)
# etc...
edit:在这种情况下,$_
的意思是“最后一个命令行的最后一个参数”。