2012-07-14 155 views
11

我有一個包含我想運行的命令行的文件。該文件包含大約2,000行。如何並行運行命令列表?

我有8個可用的內核。是否有可能解析文件並啓動8個進程,然後在其中一個程序結束時從文件中執行另一個進程?我希望這樣繼續下去,直到文件結束。

+0

請參閱[進程管理](http://mywiki.wooledge.org/ProcessManagement)。 – 2012-07-15 15:09:24

回答

18

您可以使用xargs來讀取文件,同時將最大進程數限制爲可用內核數。例如:

cores=$(fgrep -c processor /proc/cpuinfo) 
xargs --arg-file=/tmp/foo \ 
     --max-procs=$cores \ 
     --replace \ 
     --verbose \ 
     /bin/sh -c "{}" 
+1

最好的解決方案 – 2012-07-15 07:22:16

0

只需通過運行帶有&的命令即可在後臺啓動新進程。有一個示例here描述了您的問題的解決方案。

28

使用GNU parallel。這是一個令人難以置信的強大工具,官方軟件包存在大約20個左右的Linux發行版。那是什麼? You have an excuse as to why you can't use it?這裏展示瞭如何並行運行一個命令列表或文件一個簡單的例子:的jobs.txt

內容:

sleep 1; echo "a" 
sleep 3; echo "b" 
sleep 2; echo "c" 

命令:

time parallel :::: jobs.txt 

結果:

a 
c 
b 

real 0m3.332s 
user 0m0.170s 
sys  0m0.037s 

備註:

如果您希望保持訂單與輸入相同,請將-k標誌傳遞給GNU並行。

如果您擁有超過8個內核並且只希望處理8個內核,請將-j 8添加到參數列表。

man page是一個很好的閱讀,但如果你還沒有閱讀this tutorial我強烈建議時間投資。

+0

GNU並行在Ubuntu 11.10上不可用,但它在Debian sid上可用。值得注意的是,這個例子不會像moreutils包中的並行實用程序那樣工作,它具有不同的語義。 – 2012-07-15 06:58:58

+0

-j 8不需要 - 它會自動檢測到。 Ubuntu軟件包:https://build.opensuse.org/package/binaries?package=parallel&project=home%3Atange&repository=xUbuntu_11.10 – 2012-07-16 13:21:01

+0

爲了從一個文件並行運行命令,你可以執行'cat/path/to/file .txt | parallel' – 2016-04-06 06:48:06