2012-01-24 47 views
4

基於This solution我試圖開發一個腳本,將限制運行的進程數爲4.但作爲替代方案,我希望作業被存儲在一個數組中參考索引。我寫了以下內容:使用腳本運行有限數量的並行程序

todo_array[1]="echo start1;sleep 3;echo done1" 
todo_array[2]="echo start2;sleep 3;echo done2" 
todo_array[3]="echo start3;sleep 3;echo done3" 
todo_array[4]="echo start4;sleep 3;echo done4" 
todo_array[5]="echo start5;sleep 3;echo done5" 
todo_array[6]="echo start6;sleep 3;echo done6" 
todo_array[7]="echo start7;sleep 3;echo done7" 
todo_array[8]="echo start8;sleep 3;echo done8" 
todo_array[9]="echo start9;sleep 3;echo done9" 

max_jobs=4 

seq ${#todo_array[@]} | xargs -i --max-procs=$max_jobs bash -c $todo_array[{}] 

但是,當我執行我得到一個空的9 newlinex輸出。 我在做什麼錯? 感謝

編輯:我把它修改爲

seq ${#todo_array[@]} | xargs -i --max-procs=$max_jobs bash -c "$todo_array[{}]" 

,我得到以下奇怪的輸出:

start1 
start1 
start1 
start1 
done1[2] 
done1[3] 
done1[1] 
done1[4] 
start1 
start1 
start1 
start1 
done1[5] 
done1[6] 
done1[7] 
done1[8] 
start1 
done1[9] 
+0

如果我運行腳本,我沒有得到空換行符。我得到這4行錯誤:'bash:[3]:command not found bash:[2]:command not found bash:[4]:command not found bash:[1]:command not found' –

+0

我想你可能想要「&」(並行運行作業)和「$$」(跟蹤你開始的每個後臺作業的PID)。 – paulsm4

+0

陣列引用需要大括號,例如'$ {todo_array [1]}'。然而,'xargs -IX --max-procs = $ max_jobs bash -c「$ {todo_array [X]}」'對我來說不起作用,不知道爲什麼。 –

回答

4

試試這個:

#!/bin/bash 

todo_array[1]="echo start1;sleep 3;echo done1" 
todo_array[2]="echo start2;sleep 3;echo done2" 
todo_array[3]="echo start3;sleep 3;echo done3" 
todo_array[4]="echo start4;sleep 3;echo done4" 
todo_array[5]="echo start5;sleep 3;echo done5" 
todo_array[6]="echo start6;sleep 3;echo done6" 
todo_array[7]="echo start7;sleep 3;echo done7" 
todo_array[8]="echo start8;sleep 3;echo done8" 
todo_array[9]="echo start9;sleep 3;echo done9" 

max_jobs=4 

for i in "${todo_array[@]}" 
do 
    echo $i 
done | xargs -IX --max-procs=$max_jobs bash -c "X" 
+3

爲了使用xargs的'-I'選項進行漂亮的工作+1 – anubhava

3

如果你的問題不是教育而是簡單的「如何運行有限數量的並行程序「,我的建議是不使用腳本並重新發明輪子,而是使用GNU Parallel,而這正是爲此目的而設計的。

只需創建一個腳本與命令和管道它平行,即

./myScript.sh | parallel -j2 

在這個例子中,並行運行兩個並行作業,但收集腳本的輸出末,就像你實際上一個接一個地執行腳本一樣。當然,這些任務應該是獨立的;這個問題目前還不清楚。

0

您可能有興趣查看ppss。這是一個很容易使用強大的線程處理腳本/外殼的東西。