如何将两个持续生成日志的程序并行管道至同一Python程序?
解决方案:并发合并两个进程的输出到管道
你的问题出在串行执行逻辑上:{ ./log1; ./log2; }会先完整运行log1(直到它主动终止)才会启动log2,但log1是持续运行的程序,所以log2根本没机会启动,自然无法输出日志到program.py。
要让两个进程并发运行并将它们的输出实时合并到同一个管道,你需要用后台执行符&让两个进程同时启动,再把它们的输出汇总到管道。以下是几种可行的方案:
基础方案:后台并发运行
直接让两个日志程序在后台启动,它们的标准输出会自动合并到管道中:
( ./log1 & ./log2 & wait ) | python program.py
( ... )创建子shell,把两个后台进程封装在其中&让log1和log2在后台并发运行,互不阻塞wait等待两个后台进程全部终止(避免子shell提前退出,确保管道持续接收输出)
优化方案:解决缓冲问题(确保实时输出)
很多程序在标准输出不是终端时,会启用块缓冲(而非行缓冲),导致日志不会实时传输到program.py。你可以用stdbuf强制开启行缓冲,让每一行日志都立即被推送:
( stdbuf -oL ./log1 & stdbuf -oL ./log2 & wait ) | python program.py
-oL参数表示对标准输出启用行缓冲,保证日志产生后立刻进入管道
简洁写法(按需选择)
如果你不需要等待进程终止(比如会手动终止所有进程),也可以省略wait,写法更简洁:
( ./log1 & ./log2 & ) | python program.py
这样配置后,log1和log2会同时运行,它们的日志会按产生顺序交替(或并发)地进入program.py的标准输入,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Morgan Kohler




