如何多次对单个文件和程序进行tee

时间:2017-03-16 22:21:56

标签: java bash parallel-processing pipe tee

背景

我在execution.sh

中将以下命令存储为shell脚本

cat input_file | tee output_file | java program

我成功地使用./execution.sh &读取input_file,将数据存储在单个output_file中,并作为输入发送到java程序。

问题

我希望将input_file的数据多次输出到output_file以及java程序。

e.g。同时阅读input_file相同的5次并将数据发送到单个output_file和单个java program

修改

尝试过的解决方案

execution.sh

{
 python2 readLines.py &
 python2 readLines.py &
 python2 readLines.py &
 python2 readLines.py &
 python2 readLines.py &
} | tee  output_file | java program 

readLines.py

with open('inputfile') as f:
    for line in f:
       print line

我目前正在使用此功能,如果有任何人看到竞争条件等问题,请发表评论。

1 个答案:

答案 0 :(得分:2)

  

读取相同的input_file并行5次并将数据发送到单个output_file和单个java程序

让我们忽略» parallel «部分。写作只能顺序

( for i in {1..5}; do cat input_file; done ) | tee out_file | java program

或简而言之

cat input_file{,,,,} | tee out_file | java program

两个命令连续5次打印文件。

如果您真的想用并行编写,可以将cat命令作为后台作业启动:

( for i in {1..5}; do cat input_file & done ) | tee out_file | java program

此方法保证output_file包含来自input_file的所有字节恰好五次,但(当然)交错。很有可能不仅行,而且字节最终交错。这是什么意思?

如果你有文件

abc
xyz

并行打印两次,输出可能会变为

ababcc

xxyz
yz

如果这不打扰你,还要记住,如果没有出现在那个序列中,有一些字节序列会丢失/改变它们的含义,例如windows new lines \r\n或multibyte unicode characters。