一、前言

在业务开发过程中,经常会在后台写一些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多进程实现相关推荐

  1. Oracle 备份shell,oracle数据库shell备份脚本

    1.root用户下创建备份路径: mkdir /opt/backup chown oralce:oinstall /opt/backup 2.oracle用户创建备份脚本路径: mkdir /opt/ ...

  2. Linux编程 9 (shell类型,shell父子关系,子shell用法)

    一. shell类型 1.1  交互式 bin/ shell程序 当用户登录到某个虚拟控制台终端或是在GUI中启动终端仿真器时,默认的shell程序就会开始运行.系统启动什么样的shell程序取决于你 ...

  3. shell信息查看脚本linux,每次登录Shell时使用shell脚本查看Linux上的系统信息

    每次登录Shell时使用shell脚本查看Linux上的系统信息 Linux中有几个命令可以获取系统信息,例如处理器信息,制造商名称和序列号等. 您可能需要运行几个命令来收集此信息. 此外,很难记住所 ...

  4. python多进程_python多进程

    上一期我们讲了python中多线程的使用,忘记的小伙伴请戳链接复习,https://zhuanlan.zhihu.com/p/262638052. 还记得我们说到,多线程并不是真正的并发,只是充分利用 ...

  5. 7月11日任务 shell介绍、shell结构和执行 、date命令用法、shell脚本中的变量

    2019独角兽企业重金招聘Python工程师标准>>> 20.1 Shell脚本介绍 • shell是一种脚本语言  aming_linux  blog.lishiming.net ...

  6. 69:shell脚本介绍 | shell脚本结构 | 执行data命令用法 | shell脚本中变量

    2019独角兽企业重金招聘Python工程师标准>>> 1.shell脚本介绍: shell是一种脚本语言和传统的开发语言相比,会比较简单: shell有自己语法,可以支持逻辑判断. ...

  7. linux超级基础系列——什么是shell? bash和shell有什么关系

    什么是Shell?        shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序.你在提示符下输入的每个命令都由shell先解释然后传给Linux内核.    ...

  8. 反弹shell与正向shell的区别

    正向shell: 攻击机A,受害者B 正向shell:正常大家都能理解 A主动连接B,直接使用ssh命令:受害者的命令行的输入输出转到控制端 反弹shell: 反弹shell就是控制端监听在某TCP/ ...

  9. Shell编程基础---shell的结构、执行及变量

    2019独角兽企业重金招聘Python工程师标准>>> 本文索引: shell脚本介绍 shell脚本结构和执行 date命令用法 shell脚本中的变量 shell脚本介绍 she ...

  10. 会linux基本命令是脚本语言吗,如何理解Linux Shell和基本Shell脚本语言?

    理解Linux Shell: shell:一个命令行解释器,通过执行命令或脚本,帮助用户与操作系统打交道. process:进程,用户执行的任务是进程,但进程不只是任务. file:文件放在硬盘上,包 ...

最新文章

  1. 卷积神经网络的复杂度分析
  2. Android 屏幕自动旋转-Sensor属性
  3. JZOJ 3597. 【CQOI2014】危桥
  4. JavaScript- 正则表达式匹配汉字
  5. Spring_02_AOP初级总结
  6. 高级软件工程第一次作业--准备
  7. WCF开发框架形成之旅--个人图片信息的上传保存
  8. 快速西门子PLC入门(零基础心得版)
  9. 学生用计算机方着怎么计,科学计算器使用
  10. FoxMail邮箱配置
  11. 【搬运】罗霸道网文写作经验分享
  12. 1分钟了解什么是枚举/以及枚举的使用
  13. 一份给艺术爱好者的书单
  14. Java在Web端微信公众号授权登录
  15. Q平台Audio集成开发 高通Audio术语缩写
  16. matlab如何读取.mat文件,matlab中读取mat文件
  17. WinDBG详解进程初始化dll是如何加载的
  18. 后记——再见南航829
  19. 如何在3dmax中导入照片作为背景
  20. 计算机学院校运会解说词,运动会学院解说词

热门文章

  1. 【BERT】源码分析(PART I)
  2. 干货 | 一文掌握常用的机器学习模型
  3. TF2—tf.keras.layers.BatchNormalization
  4. Kubernetes入门——k8s概念和架构
  5. 博文视点大讲堂35期《Google Android创赢路线与产品开发实战》读者见面会
  6. 13.2 Question Answering 问答系统意境级讲解
  7. Machine Learning - II. Linear Regression with One Variable单变量线性回归 (Week 1)
  8. Scipy教程 - python数值计算库
  9. 详解Transformer
  10. jersey tomcat MySQL_IDEA+Jersey+Tomcat搭建RESTful API