将两个日志生成程序并行管道到一个python程序中

时间:2018-05-24 18:33:56

标签: bash pipe

我有两个相同的程序,它们会无限期地生成日志,直到它们被终止。我的bash程序的当前迭代将其中一个日志生成程序传输到python程序中,该程序实时处理日志:

./log1 | python program.py

我现在想要将第二个日志程序“log2”添加到管道中,以便将它们的日志提供给program.py。我尝试将两者分组为一个,如:

{ ./log1; ./log2; } | python program.py

但是这只会将log1传递到program.py,因为log1永远不会结束。我需要两个日志将他们的数据发送到program.py,如:

  1. log1数据> program.py
  2. log2数据> program.py
  3. log1数据> program.py
  4. log1数据> program.py
  5. log2数据> program.py
  6. 基本上,program.py只是同时接受最新的stdout到它的stdin中。如果有人有任何想法会很棒。

1 个答案:

答案 0 :(得分:0)

我猜你可以创建一个在后台运行log1log2的脚本,然后将其传递给program.py

例如,一个名为all_logs.bash的脚本:

./log1 &
./log2 &
wait # waits for all background processes to finish

然后运行:

./all_logs.bash | program.py

确保您all_logs.bash可执行。

示例

使用以下方法进行测试似乎有效:

# all_logs.bash
(for n in $(seq 5); do echo a$n; sleep 0.9; done) &
(for n in $(seq 5); do echo b$n; sleep 0.6; done) &
wait

# stdin_test.py
from __future__ import print_function
import sys

while True:
    data = sys.stdin.readline()
    if data:
        print('data: {}'.format(data), end='')
        sys.stdout.flush()
    else:
        break

print('Done.')

输出以下内容:

$ ./all_logs.bash | python stdin_test.py
data: a1
data: b1
data: b2
data: a2
data: b3
data: a3
data: b4
data: b5
data: a4
data: a5
Done.