shell 模擬多進程 (2)

鑑於第一次的腳本不能控制同時執行的進程數目從而不能保障下載速度,將原腳本修改爲:

########################以下是腳本#####################
#!/bin/bash
#filename mwget.sh
base=/usr/local/data
thread=6
task0(){
cd $base
wget -m -np  -c -nH  http://x.x.x.x/VipProcessData/BasicObject/AreaObject/
}
task1(){
cd $base
wget -m -np  -c -nH  http://x.x.x.x/VipProcessData/BasicObject/ClassObject/
}
task2(){
cd $base
wget -m -np  -c -nH  http://x.x.x.x/VipProcessData/BasicObject/FullTextObject/
}
task3(){
cd $base
wget -m -np  -c -nH  http://x.x.x.x/VipProcessData/BasicObject/FundObject/
}
task4(){
cd $base
wget -m -np  -c -nH  http://x.x.x.x/VipProcessData/BasicObject/MediaObject/
}
task5(){
cd $base
wget -m -np  -c -nH  http://x.x.x.x/VipProcessData/BasicObject/OrganObject/
}
task6(){
cd /usr/local/data/VipProcessData/BasicObject/SubjectObject
wget -c -i /usr/local/data/wget/SubjectObject01
}
task7(){
cd /usr/local/data/VipProcessData/BasicObject/SubjectObject
wget -c -i /usr/local/data/wget/SubjectObject02
}
task8(){
cd /usr/local/data/VipProcessData/BasicObject/SubjectObject
wget -c -i /usr/local/data/wget/SubjectObject03
}
task9(){
cd /usr/local/data/VipProcessData/BasicObject/SubjectObject
wget -c -i /usr/local/data/wget/SubjectObject04
}
task10(){
cd /usr/local/data/VipProcessData/BasicObject/WriterObject
wget -c -i /usr/local/data/wget/WriterObject01
}
task11(){
cd /usr/local/data/VipProcessData/BasicObject/TitleObject
wget -c -i /usr/local/data/wget/TitleObject01
}
task12(){
cd /usr/local/data/VipProcessData/BasicObject/TitleObject
wget -c -i /usr/local/data/wget/TitleObject02
}
task13(){
cd /usr/local/data/VipProcessData/BasicObject/TitleObject
wget -c -i /usr/local/data/wget/TitleObject03
}
task14(){
cd /usr/local/data/VipProcessData/BasicObject/TitleObject
wget -c -i /usr/local/data/wget/TitleObject04
}
task15(){
cd /usr/local/data/VipProcessData/BasicObject/TitleObject
wget -c -i /usr/local/data/wget/TitleObject05
}
task16(){
cd /usr/local/data/VipProcessData/BasicObject/TitleObject
wget -c -i /usr/local/data/wget/TitleObject06
}
function a_sub() { # 此處定義一個函數,(子進程,進程內爲實際打算每個進程內須要執行的命令)
task$i
#sleep $i
#echo "start....... ${task[i]}"
}
tmp_fifofile="/tmp/$.fifo"
mkfifo $tmp_fifofile      # 新建一個fifo類型的文件
exec 6<>$tmp_fifofile      # 將fd6指向fifo類型
rm $tmp_fifofile
for ((i=0;i<$thread;i++));do
echo
done >&6 # 事實上就是在fd6中放置了$thread個回車符                      #循環1 創建6個進程
date_start=$(date +%s)
for  ((i=0;i<17;i++));do                                                           #循環2 啓動多進程
read  -u6 #每啓動一個子進程就在fifo中刪除一個回車
{
a_sub && {
echo "task$i finshed"
} ||{
echo "error"
}
echo >&6   # 每完成一個子進程就在fifo中增加一個回車
 }&
done
wait
exec 6>&-              刪除fd6文件描述符
date_stop=$(date +%s)
echo "download finshed ;and all run $((date_stop-date_start)) sec"
exit 0
####################以上是腳###########################



可以看到 先定義了task0~task16總共17個任務的函數 每個函數實際就是一個wget
然後創建一個fifo文件並指定一個文件描述符; 然後循環1中在fifo中放入
$thread個回車(n爲進程數);循環2中每次啓動一個子進程前先刪除一個回車;循環載入進程,由於前只創建了$thread個進程(文件描述符裏只有$thread個回車);只有完成一個進程並重寫一個回車到fifo中 循環2才能繼續循環。

task1(){
cd /usr/local/data/VipProcessData/BasicObject/TitleObject
wget -c -i /usr/local/data/wget/TitleObject01
}
task任務 最初是放在數組裏的
task[0]="
cd /usr/local/data/VipProcessData/BasicObject/TitleObject && wget -c -i /usr/local/data/wget/TitleObject01"
但是放在數組中後
在a_sub中載入的時候
function a_sub()
${task[i]}
echo "start....... ${task[i]}"
}
發現 echo "start....... ${task[i]} 沒問題,但是${task[i]} 實際沒有執行命令 因此 暫時把命令改爲放在函數裏了。

發現 ${task[i]}沒有實際執行的原因是 ${task[i]}變量裏是 命令1 && 命令2 && 命令3這種形式的;這種形式的命令如果放在變量裏 想通過變量引用直接執行會失敗。 把${task[i]} 換成 exec ${task[i]} 可以看到 多了'' 感覺是shell把多個命令用強引給分開了。


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