shell腳本中使用for循環開啓並行方法

大家經常使用for循環來給指定腳本輸入參數,按照參數的輸入順序腳本順序執行,如以下腳本:

for (( i = 1; i <= 999; i++ ))
do
	sh diaoyong.sh $i 
done

把1-999不停輸入diaoyong.sh腳本中,該腳本要循環999次才能執行完成,執行效率極慢,我們可以使用for循環中的並行,根據輸入的參數,同時執行多個任務,但是這種會同時開啓999個任務,爲了不讓主機宕機,還是不能使用這種方法

for (( i = 1; i <= 999; i++ ))
do
	{	sh diaoyong.sh $i
	}&
done

所以,如何控制同事執行的任務個數呢?可以參考以下方法!

例如:同時開啓10個任務,待10個任務執行完畢後開啓下一輪十個任務,如下:

1,編寫一個txt文檔,把要輸入的參數按順序十個一行排列,如下:

1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
... 

2,編寫腳本,如下:

#!/bin/bash
stime=`date +%s` 
#腳本開始執行時間
echo `date +%F\ %T` start
for (( i = 1; i < 99; i++ ))
do
	prov=`cat tbs.txt|awk "NR==$i{print}"|awk '{print $1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "$10}'`	
         #讀取第一行所有參數
	echo $prov
	for db in $prov
	do
	echo `date +%F\ %T` start $db
	{	sh diaoyong.sh $db > log/log.$db 2>&1
	}&
	done
wait
#等待第一行任務執行完畢開始執行下一行
 done
etime=`date +%s`

s=`echo "scale=0; ($etime - $stime)%60" | bc`
m=`echo "scale=0; ($etime - $stime)/60%60" | bc`
h=`echo "scale=0; ($etime - $stime)/60/60" | bc`

echo `date +"%F %T"` end 耗時 $h 小時 $m 分鐘 $s 秒



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章