2011-01-11 78 views
6

鉴于STDIN以下示例输入:是否可以在并行进程中分发STDIN?

foo 
bar bar 
baz 
=== 
qux 
bla 
=== 
def 
zzz yyy 

是否有可能将其分割的分隔符(在此情况下“===”)和饲料它标准输入到并行运行的指令?

所以例如输入上述将导致其中每个实例上接收的STDIN数据的一部分,象这样3个并行的进程(例如,命令调用do.sh):

do.sh(例如1)本接收通过STDIN:

foo 
bar bar 
baz 

do.sh(实例2)接收该经STDIN:

qux 
bla 

do.sh(例如3)接收到这个标准输入:

def 
zzz yyy 

我想这样的事情可能使用xargs的或GNU平行的,但我不知道怎么办。

回答

10

GNU并行能做到这一点从20110205.

cat | parallel --pipe --recend '===\n' --rrs do_stuff 
2

版本在一般情况下,没有。这种评估的原因之一是,从文件而不是终端读取标准I/O数据时,一次读取数据块 - BUFSIZ字节,其中BUFSIZ通常是2的幂,例如512或更大。如果数据在文件中,则一个进程将读取显示的整个文件 - 其他文件如果共享相同的打开文件描述(类似于文件描述符,但几个文件描述符可以共享相同的打开文件描述)可能在不同的进程中),或者如果它们没有共享相同的打开文件描述,则会读取整个相同的文件。

因此,您需要一个读取文件的进程来知道它需要将信息包裹到三个进程 - 而且它需要知道如何连接到三个进程。这可能是您的分销商程序运行三个流程并写入其单独的管道输入。或者可能是分销商连接到三个套接字并写入不同的套接字。

您的示例没有显示/描述如果有37个由标记分隔的部分会发生什么情况。

我有一个名为tpipe家庭酿造程序,它是像Unix tee命令,但默认情况下它写入(所有的),其标准输入的拷贝到每个流程,并到标准输出了。这可能是您需要的合适基础(至少涵盖了它的流程管理部分)。如果您想要一份副本,请联系我 - 查看我的个人资料。


如果你正在使用bash,你可以使用普通的tee与过程替代模拟tpipe。请参阅此article以了解如何使用。

SF 96245见的相同信息的另一个版本 - 加上一个名为pee程序的链接,非常类似于tpipe(相同的基本理念,在各方面稍有不同的实现)。

+0

`tpipe`与`pee`有什么区别? – 2011-01-11 21:18:33

1

您可以使用named pipes来做到这一点。命名管道允许您将标准管道视为文件。您可以拥有多个命名管道,并让您的其他程序处理它们。

我不是所有人都熟悉命名管道,但我不时在这种情况下使用它们。

相关问题