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,如需转载请自行联系原作者






相关文章
|
8月前
|
Shell
shell中并发执行多个进程
shell中并发执行多个进程
814 4
|
8月前
|
监控 Shell
在Shell中自动重启进程
在Shell中自动重启进程
539 1
|
8月前
|
Shell Linux 调度
【Shell 命令集合 系统管理 】Linux 调整进程优先级 renice命令 使用指南
【Shell 命令集合 系统管理 】Linux 调整进程优先级 renice命令 使用指南
148 0
|
8月前
|
存储 监控 Linux
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 查看当前正在运行的进程信息 ps命令 使用指南
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 查看当前正在运行的进程信息 ps命令 使用指南
142 0
|
8月前
|
存储 Shell Linux
【Shell 命令集合 系统设置 】⭐⭐⭐Linux 限制进程资源 ulimit命令 使用指南
【Shell 命令集合 系统设置 】⭐⭐⭐Linux 限制进程资源 ulimit命令 使用指南
138 0
|
8月前
|
监控 Shell Linux
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 向进程发送信号 kill命令 使用指南
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 向进程发送信号 kill命令 使用指南
115 0
|
8月前
|
Shell Linux 开发工具
linux shell脚本利用 kill -0 检查进程是否存在
linux shell脚本利用 kill -0 检查进程是否存在
256 1
|
7月前
|
Unix Shell Perl
技术心得:实例解析shell子进程(subshell)
技术心得:实例解析shell子进程(subshell)
|
7月前
|
Shell Linux
【linux】进程替换的应用|shell解释器的实现
【linux】进程替换的应用|shell解释器的实现
42 0
|
8月前
|
Shell Linux
【Linux】进程实践项目(更新中) — 自主shell编写
前几篇文章,我们学习进程的相关知识:进程概念,进程替换,进程控制。熟悉了进程到底是个什么事情,接下来我们来做一个实践,来运用我们所学的相关知识。这个项目就是手搓一个shell模块,模拟实现Xshell中的命令行输入。
78 1