shell oracle 多进程,Shell多进程实现
一、前言
在业务开发过程中,经常会在后台写一些shell脚本处理数据,但估计很多人不知道shell脚本也可以支持多进程,而且非常简单。本篇文章主要就是介绍shell实现多进程以及进程数量控制。
二、需求
为了更好的说明问题,我们结合例子讲解,假设需求就是扫描url.txt文件,然后判断里面的URL是否失效。url.txt文件的内容是一行一个URL,如:
www.baidu.com
www.51cto.com
www.ywnds.com
www.bing.cn
1
2
3
4
www.baidu.com
www.51cto.com
www.ywnds.com
www.bing.cn
单进程实现
那么shell脚本scanurl.sh可以这样写:
#!/bin/bash
if [ $# != 1 ] ;then
echo "The parameters you enter is not correct !";
exit -1;
fi
# 循环读出URL并判断状态码;
echo "执行开始: `date +%s`"
while read line
do
{
isok=`curl -I -o /dev/null -s -w %{http_code} $line`
if [ "$isok" = "200" ]; then
echo $line "OK"
else
echo $line "no"
fi
}
done < $1
echo "执行结束: `date +%s`"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
if[$# != 1 ] ;then
echo"The parameters you enter is not correct !";
exit-1;
fi
# 循环读出URL并判断状态码;
echo"执行开始: `date +%s`"
whilereadline
do
{
isok=`curl-I-o/dev/null-s-w%{http_code}$line`
if["$isok"="200"];then
echo$line"OK"
else
echo$line"no"
fi
}
done
echo"执行结束: `date +%s`"
那么可以执行下面的命令扫描:
$ /bin/sh scanurl.sh url.txt
1
$/bin/shscanurl.shurl.txt
但这样脚本执行非常慢,一万个URL几个小时都扫描不完。
多进程实现
改成多进程实现非常简单,只需要在do后面的大括号加&符号,在done后面加一个wait,表示父进程等待子进程退出后再退出。
#!/bin/bash
if [ $# != 1 ] ;then
echo "The parameters you enter is not correct !";
exit -1;
fi
# 循环读出URL并判断状态码;
echo "执行开始: `date +%s`"
while read line
do
{
isok=`curl -I -o /dev/null -s -w %{http_code} $line`
if [ "$isok" = "200" ]; then
echo $line "OK"
else
echo $line "no"
fi
}&
done < $1
wait
echo "执行结束: `date +%s`"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash
if[$# != 1 ] ;then
echo"The parameters you enter is not correct !";
exit-1;
fi
# 循环读出URL并判断状态码;
echo"执行开始: `date +%s`"
whilereadline
do
{
isok=`curl-I-o/dev/null-s-w%{http_code}$line`
if["$isok"="200"];then
echo$line"OK"
else
echo$line"no"
fi
}&
done
wait
echo"执行结束: `date +%s`"
这样就能多进程并发执行了,但有个问题是进程会一下子非常多,几百上千,超过系统限制报错,下面我们就加上进程数控制。
多进程实现并控制进程数
#!/bin/bash
# 允许的进程数;
THREAD_NUM=20
# 定义描述符为9的管道;
mkfifo tmp
exec 9<> tmp
# 预先写入指定数量的换行符,一个换行符代表一个进程;
for ((i=0;i
do
echo -ne "\n" 1>&9
done
# 循环执行sleep命令;
echo "执行开始: `date +%s`"
for i in `seq 1 30`;
do
{
# 进程控制;
read -u 9
{
sleep 10
echo -ne "\n" 1>&9
}&
}
done
wait
echo "执行结束: `date +%s`"
rm tmp
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
#!/bin/bash
# 允许的进程数;
THREAD_NUM=20
# 定义描述符为9的管道;
mkfifotmp
exec9<>tmp
# 预先写入指定数量的换行符,一个换行符代表一个进程;
for((i=0;i
do
echo-ne"\n"1>&9
done
# 循环执行sleep命令;
echo"执行开始: `date +%s`"
foriin`seq130`;
do
{
# 进程控制;
read-u9
{
sleep10
echo-ne"\n"1>&9
}&
}
done
wait
echo"执行结束: `date +%s`"
rmtmp
上面的代码就可以保证子进程在指定数量了,其进程控制原理是通过管道实现的,当管道无内容可读时就不会执行。而且每个进程执行完成后都会向管道写入一个换行符,从而保证进程数是指定的。
这样就能达到我们的目的了。
最后来一个根据位置参数个数跑多进程任务,示例代码如下:
$ cat test.sh
for((i=0;$#>i;));do
{
sleep $1
if [ $? = 0 ];then
echo "$1 ok"
else
echo "$1 fail"
fi
}&
shift 1
done
1
2
3
4
5
6
7
8
9
10
11
12
$cattest.sh
for((i=0;$#>i;));do
{
sleep$1
if[$?=0];then
echo"$1 ok"
else
echo"$1 fail"
fi
}&
shift1
done
然后就可以在命令行,输入数值了:
$ bash test.sh 10 15 20 25
$ ps aux | grep sleep
root 13668 0.0 0.0 100908 572 pts/1 S 15:24 0:00 sleep 10
root 13670 0.0 0.0 100908 572 pts/1 S 15:24 0:00 sleep 15
root 13672 0.0 0.0 100908 576 pts/1 S 15:24 0:00 sleep 20
root 13673 0.0 0.0 100908 576 pts/1 S 15:24 0:00 sleep 25
1
2
3
4
5
6
$bashtest.sh10152025
$psaux|grepsleep
root136680.00.0100908572pts/1S15:240:00sleep10
root136700.00.0100908572pts/1S15:240:00sleep15
root136720.00.0100908576pts/1S15:240:00sleep20
root136730.00.0100908576pts/1S15:240:00sleep25
脚本会跟着你位置参数的个数决定开启多少个进程跑任务。
如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
shell oracle 多进程,Shell多进程实现相关推荐
- Oracle 备份shell,oracle数据库shell备份脚本
1.root用户下创建备份路径: mkdir /opt/backup chown oralce:oinstall /opt/backup 2.oracle用户创建备份脚本路径: mkdir /opt/ ...
- Linux编程 9 (shell类型,shell父子关系,子shell用法)
一. shell类型 1.1 交互式 bin/ shell程序 当用户登录到某个虚拟控制台终端或是在GUI中启动终端仿真器时,默认的shell程序就会开始运行.系统启动什么样的shell程序取决于你 ...
- shell信息查看脚本linux,每次登录Shell时使用shell脚本查看Linux上的系统信息
每次登录Shell时使用shell脚本查看Linux上的系统信息 Linux中有几个命令可以获取系统信息,例如处理器信息,制造商名称和序列号等. 您可能需要运行几个命令来收集此信息. 此外,很难记住所 ...
- python多进程_python多进程
上一期我们讲了python中多线程的使用,忘记的小伙伴请戳链接复习,https://zhuanlan.zhihu.com/p/262638052. 还记得我们说到,多线程并不是真正的并发,只是充分利用 ...
- 7月11日任务 shell介绍、shell结构和执行 、date命令用法、shell脚本中的变量
2019独角兽企业重金招聘Python工程师标准>>> 20.1 Shell脚本介绍 • shell是一种脚本语言 aming_linux blog.lishiming.net ...
- 69:shell脚本介绍 | shell脚本结构 | 执行data命令用法 | shell脚本中变量
2019独角兽企业重金招聘Python工程师标准>>> 1.shell脚本介绍: shell是一种脚本语言和传统的开发语言相比,会比较简单: shell有自己语法,可以支持逻辑判断. ...
- linux超级基础系列——什么是shell? bash和shell有什么关系
什么是Shell? shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序.你在提示符下输入的每个命令都由shell先解释然后传给Linux内核. ...
- 反弹shell与正向shell的区别
正向shell: 攻击机A,受害者B 正向shell:正常大家都能理解 A主动连接B,直接使用ssh命令:受害者的命令行的输入输出转到控制端 反弹shell: 反弹shell就是控制端监听在某TCP/ ...
- Shell编程基础---shell的结构、执行及变量
2019独角兽企业重金招聘Python工程师标准>>> 本文索引: shell脚本介绍 shell脚本结构和执行 date命令用法 shell脚本中的变量 shell脚本介绍 she ...
- 会linux基本命令是脚本语言吗,如何理解Linux Shell和基本Shell脚本语言?
理解Linux Shell: shell:一个命令行解释器,通过执行命令或脚本,帮助用户与操作系统打交道. process:进程,用户执行的任务是进程,但进程不只是任务. file:文件放在硬盘上,包 ...
最新文章
- 卷积神经网络的复杂度分析
- Android 屏幕自动旋转-Sensor属性
- JZOJ 3597. 【CQOI2014】危桥
- JavaScript- 正则表达式匹配汉字
- Spring_02_AOP初级总结
- 高级软件工程第一次作业--准备
- WCF开发框架形成之旅--个人图片信息的上传保存
- 快速西门子PLC入门(零基础心得版)
- 学生用计算机方着怎么计,科学计算器使用
- FoxMail邮箱配置
- 【搬运】罗霸道网文写作经验分享
- 1分钟了解什么是枚举/以及枚举的使用
- 一份给艺术爱好者的书单
- Java在Web端微信公众号授权登录
- Q平台Audio集成开发 高通Audio术语缩写
- matlab如何读取.mat文件,matlab中读取mat文件
- WinDBG详解进程初始化dll是如何加载的
- 后记——再见南航829
- 如何在3dmax中导入照片作为背景
- 计算机学院校运会解说词,运动会学院解说词
热门文章
- 【BERT】源码分析(PART I)
- 干货 | 一文掌握常用的机器学习模型
- TF2—tf.keras.layers.BatchNormalization
- Kubernetes入门——k8s概念和架构
- 博文视点大讲堂35期《Google Android创赢路线与产品开发实战》读者见面会
- 13.2 Question Answering 问答系统意境级讲解
- Machine Learning - II. Linear Regression with One Variable单变量线性回归 (Week 1)
- Scipy教程 - python数值计算库
- 详解Transformer
- jersey tomcat MySQL_IDEA+Jersey+Tomcat搭建RESTful API