shell 模拟多进程 (2)

鉴于第一次的脚本不能控制同时执行的进程数目从而不能保障下载速度,将原脚本修改为:

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
########################以下是脚本#####################
#!/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把多个命令用强引给分开了。


      本文转自天山三害 51CTO博客,原文链接:http://blog.51cto.com/skybug/1337788,如需转载请自行联系原作者






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值