2011-07-06 44 views
2

我正在運行GNU bash,版本爲3.2.39(1)-release(x86_64 -pc-Linux的GNU)。 我有一個關於等待在子shell中運行的作業的具體問題,根據我想要允許的最大並行進程數,然後等待剩下的子shell作業完成,然後在執行下一步之前完成管道(如果我在這裏做適當意義上的)..在bash中等待作業,允許同時進行有限的並行作業,然後爲所有作業完成以繼續處理其餘的管道

從本質上講,我的僞代碼如下所示:

MAX_PROCS=3 
    for ((k = 0 ; $k < $kmerlen ; k += 1)) 
    do 
    (
    ### Running a perl script here for each k (this script is a memory hog)... 
    )& 
    while [ $(ps -e | grep 'perlScriptAbove' | grep -v grep | wc -l) -gt ${MAX_PROCS} ] ; 
    do 
     wait 
    done 

    done 

    ###wait <- works fine without this wait, but I need all kmerlen jobs to finish first to proceed to the next part of the pipeline 
    ## Run the rest of the pipeline... 

在while循環的第一個等待語句工作正常產卵3級的工作,但是當我使用下一個等待聲明,該屬性丟失,產生的子彈的數量等於我的kmerlen

我很抱歉,如果這已被回答,但我似乎沒有找到一個。

非常感謝。

+0

看看這個帖子。它可以幫助:[如何限制數量的線程 - 在一個功能在bash](http://stackoverflow.com/questions/6511884/how-to-limit-number-的線程使用的功能於一個功能合的bash /)。 – Lynch

+0

帶有max-procs參數的xargs對我來說是新的 - 非常尖銳!從現在開始,這將進入我的工具箱 - 非常感謝! – SirishaS

回答

5

簡單地調用wait應該等待所有由shell執行的後臺作業,它看起來像這正是u需要。

I.e.你的代碼應該是這樣的:

while (not all jobs spawned) # i.e. you want to do 40 jobs 
    spawn as much jobs as you need in parallel (i.e. 4 jobs) 
    wait 
+0

不過,我打算只產卵的後臺作業(這些需要大量的存儲器),數量有限,同時... – SirishaS

+0

@SirishaS - 我已經更新了答案澄清 – Drakosha

+0

謝謝。我仍然不太確定爲什麼我的方法不起作用,但接受了您的建議,並在for循環之後執行了此操作:if [[''expr $ {k}%$ {MAX}'-eq 0]] && [[$ {k} -ne 0]];然後等待###等待所有已經衍生的3個作業fi使用另一副眼睛幫助。非常感謝! – SirishaS

2

不完全是bash的,但它做什麼你問: parallel-jobs是一個Perl程序,我言盡正是這一點。您可以指定一個「作業」文件,其中每行是一個作業(一個bash單行),並且要並行執行的作業的最大數量,並且會保持這些作業的運行,直到所有作業完成。

它適用於perl的標準安裝(不需要額外的模塊)。你可能也想看看gnu parallel,這很類似。

+0

感謝您的提示和代碼凱爾。你的方式可能會更強大的捕獲所有子進程的退出狀態作爲一個子集......?在您的許可下,我想玩弄並使用您的代碼。再次感謝。 – SirishaS

+1

絕對的,它是在公共領域,所以感覺自由:) –

3

GNU Parallel是爲這類任務而設計的。 GZIP並行和貓他們都TXT的文件彙集成一個大的.gz文件:

parallel gzip -c ::: *.txt > out.gz 

觀看介紹視頻,以瞭解更多:http://www.youtube.com/watch?v=OpaiGYxkSuQ

相關問題