2013-02-04 69 views
3

我有,我以後其他類似的運行我的bash命令行一個腳本一個問題:控制在UNIX上運行的後臺作業數殼

./process.sh data1.txt 
./process.sh data2.txt 
... 
./process.sh dataN.txt 

我想要做的是啓動這些作爲後臺工作,但只有10個在任何時間運行。我可以用傳統的編程語言來做到這一點(我非常喜歡使用連接,等待樣式結構)我所擁有的問題是如何使用UNIX bash來做到這一點。

謝謝。

回答

4
BG_LIMIT=10 
counter=0 
for data in data*.txt; do 
    ./process.sh $data & 
    if ((++counter % $BG_LIMIT == 0)); then 
     echo "Wating for background jobs to complete..." 
     wait 
    fi 
done 
echo "Waiting for any remaining jobs to complete..." 
wait 
+0

有趣的解決方案,但不會(在你的解決方案中)併發可能超過BG_LIMIT。如果我理解這個邏輯,它會在每次推出的第10項工作中等待。但是不能保證工作將按順序結束。 – user1172468

+3

不,「wait」實際上是在等待每個後臺作業的完成,所以無論它們是按照它們生成的順序完成都沒關係。 –

2

您可以使用xargs還有:

$ for x in data*.txt; do echo "$x"; done | xargs -n 1 -P 10 ./process.sh 

for循環不同的變化是可能的:find,簡單echo data*.txt等問題的關鍵是生產上的標準文件名列表輸入xargs進行閱讀。