shell指令碼中使用for迴圈開啟並行方法
阿新 • • 發佈:2019-01-07
大家經常使用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 秒