2014-10-02 65 views
1

我正在處理由xargs產生的多個並行進程的文本文件。我還需要將每個進程的stdout捕獲到一個單獨的日誌文件中。下面是一個例子,其中每個進程的輸出交織到一個文件中 - 而不是我想要的。Bash:從多個xargs並行進程記錄stdout以分離日誌文件

理想地,每個日誌文件應由文件行號進行編號,即,日誌文件-1,日誌文件-2等

cat inputfile.txt | xargs -n 1 -P 8 ./myScript.sh | tee logfile 

這將是很好,如果能夠避免外部包裝腳本,但是如果有一種方法可以用my文件包裝myScript,那就行了。

+1

在myScript.sh裏面做一個'exec> logfile - $$'或者其他的?基本上腳本控制它的日誌記錄而不是'xargs'嘗試它。 – bishop 2014-10-02 20:09:58

回答

1

試試這個:

nl inputfile.txt | xargs -n 2 -P 8 sh -c './myScript.sh "$1" > logfile-$0' 

這是假設在inputfile.txt每個參數都在自己的路線,並且不包含空格。命令nl命令每一行編號,它將每個參數與唯一編號進行配對。 xargs命令在時間上有兩個參數,第一個是行號,第二個是從inputfile.txt開始的對應行,並將它們傳遞給shsh命令使用參數分別生成輸出文件名和參數myScript.sh

+0

''$ 1「',而不是裸」$ 1「,但非常正確的想法。 – 2014-10-02 21:50:47

+0

它可能沒有區別,因爲'xargs'在空格處分隔參數,但是我認爲'inputfile.txt'可能有引用的參數。 – 2014-10-02 21:55:28

+0

@Ross,聰明的解決方案。除了日誌文件,我還希望屏幕上的輸出。它似乎與一個小的改變:nl inputfile.txt | xargs -n 2 -P 8 sh -c'./myScript.sh「$ 1」| tee logfile- $ 0' – Steve 2014-10-03 12:28:24

2

你可以使用GNU並行,而不是和它-k選項,以保持輸出順序,在一個日誌文件:

cat input | parallel -k ./myScript.sh > file.log 

您可以parallel後添加-j 8保持8個內核忙碌,但它會繼續無論如何,所有內核都默認忙碌。

+0

你看過GNU並行的源代碼嗎?使鼠巢看起來像組織模型。 – 2014-10-02 21:51:27

+0

@CharlesDuffy我實際上已經和我一致認爲這很難閱讀,但我的經驗是,它每次使用它都會起到一定的作用。我也發現它很難讀取Linux內核...... :-) – 2014-10-02 21:55:45

+0

@CharlesDuffy只要不破壞當前的功能,改進總是受歡迎的。 – 2014-10-07 08:12:20

相關問題