shell 模拟多进程(2)中原本打算把任务存放在数组中的;由于在a_sub中直接饮用数组变量来执行未成功,换成了17个函数来存放

参照 http://skybug.blog.51cto.com/132577/1337783 如何将shell的变量当命令执行 将脚本修改为

########################以下是脚本#####################
#!/bin/bash
#filename 
base=/usr/local/data/
thread=6
task[0]="cd $base && wget -m -np  -c -nH  http://x.x.x.x/VipProcessData/BasicObject/AreaObject/"
task[1]="cd $base && wget -m -np  -c -nH  http://x.x.x.x/VipProcessData/BasicObject/ClassObject/"
task[2]="cd $base && wget -m -np  -c -nH  http://x.x.x.x/VipProcessData/BasicObject/FullTextObject/"
task[3]="cd $base && wget -m -np  -c -nH  http://x.x.x.x/VipProcessData/BasicObject/FundObject/"
task[4]="cd $base && wget -m -np  -c -nH  http://x.x.x.x/VipProcessData/BasicObject/MediaObject/"
task[5]="cd $base && wget -m -np  -c -nH  http://x.x.x.x/VipProcessData/BasicObject/OrganObject/"
task[6]="cd /usr/local/data/VipProcessData/BasicObject/SubjectObject  &&  wget -c -i /usr/local/data/wget/SubjectObject01"
task[7]="cd /usr/local/data/VipProcessData/BasicObject/SubjectObject  &&  wget -c -i /usr/local/data/wget/SubjectObject02"
task[8]="cd /usr/local/data/VipProcessData/BasicObject/SubjectObject  &&  wget -c -i /usr/local/data/wget/SubjectObject03"
task[9]="cd /usr/local/data/VipProcessData/BasicObject/SubjectObject  &&  wget -c -i /usr/local/data/wget/SubjectObject04"
task[10]="cd /usr/local/data/VipProcessData/BasicObject/WriterObject  &&  wget -c -i /usr/local/data/wget/WriterObject01"
task[11]="cd /usr/local/data/VipProcessData/BasicObject/TitleObject  &&   wget -c -i /usr/local/data/wget/TitleObject01"
task[12]="cd /usr/local/data/VipProcessData/BasicObject/TitleObject  &&   wget -c -i /usr/local/data/wget/TitleObject02"
task[13]="cd /usr/local/data/VipProcessData/BasicObject/TitleObject  &&   wget -c -i /usr/local/data/wget/TitleObject03"
task[14]="cd /usr/local/data/VipProcessData/BasicObject/TitleObject  &&   wget -c -i /usr/local/data/wget/TitleObject04"
task[15]="cd /usr/local/data/VipProcessData/BasicObject/TitleObject  &&   wget -c -i /usr/local/data/wget/TitleObject05"
task[16]="cd /usr/local/data/VipProcessData/BasicObject/TitleObject  &&   wget -c -i /usr/local/data/wget/TitleObject06"
function a_sub() { # 此处定义一个函数,(子进程)
echo ${task[i]} | awk '{run=$0;system(run)}'  #把task[i]中的命令重定向到awk中用system()函数调用执行
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个回车符
date_start=$(date +%s)
for  ((i=0;i<17;i++));do
read  -u6 #每启动一个子进程就在fifo中删除一个回车
{
a_sub && {
echo "${task[i]} finshed"
} ||{
echo "error"
}
echo >&6
}&
done
wait
exec 6>&-
date_stop=$(date +%s)
echo "download finshed ;and all run $((date_stop-date_start)) sec"
exit 0