【问题标题】:How to tee multiple times to a single file and program如何多次打开单个文件和程序
【发布时间】:2017-03-16 22:21:56
【问题描述】:

背景

我将以下命令作为 shell 脚本存储在 execution.sh

cat input_file | tee output_file | java program

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

问题

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

例如并行读取相同的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

我目前正在使用这个,如果有人在这里看到任何问题,例如比赛条件等,请发表评论。

【问题讨论】:

  • 为什么要这样做?因为我不认为这是一个好主意
  • 这是一个糟糕的主意,因为如果没有独占写锁,每个进程都会覆盖其他进程的数据。另外,即使您确实有排他锁,也很难管理数据排序。你为什么要这样做是一个很好的问题。
  • 我想模拟 apache 所做的事情。多个进程正在将日志写入单个error_log 文件,该文件也被teeed 到用java 编写的消费者。我不关心日志的顺序对我来说重要的是java程序处理的最后的总数。
  • Apache 不会像你描述的那样做任何事情。
  • 制作一个小程序,从输入中读取一行,写入并休眠一小段随机时间。启动这个程序 5 次,输出重定向到输出文件。

标签: java bash parallel-processing pipe tee


【解决方案1】:

并行读取相同的 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 新行 \r\n 或多字节 unicode 字符.

【讨论】:

  • 编辑了我的问题以说明我正在尝试什么。请发表评论。
猜你喜欢
  • 2015-09-10
  • 2017-05-12
  • 2018-05-09
  • 2022-06-13
  • 1970-01-01
  • 2017-03-28
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
相关资源
最近更新 更多