2011-01-11 74 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來做到這一點。命名管道允許您將標準管道視爲文件。您可以擁有多個命名管道,並讓您的其他程序處理它們。

我不是所有人都熟悉命名管道,但我不時在這種情況下使用它們。

相關問題