当前位置:  操作系统/服务器>linux

Shell多线程操作及线程数控制实例

    来源: 互联网  发布时间:2014-10-16

    本文导语:  前言 在业务开发过程中,经常会在后台写一些shell脚本处理数据,但估计很多人不知道shell脚本也可以支持多线程,而且非常简单。本篇文章主要就是介绍shell实现多进程以及进程数量控制。 需求 为了更好的说明问题,我们结...

前言

在业务开发过程中,经常会在后台写一些shell脚本处理数据,但估计很多人不知道shell脚本也可以支持多线程,而且非常简单。本篇文章主要就是介绍shell实现多进程以及进程数量控制。

需求

为了更好的说明问题,我们结合例子讲解,假设需求就是扫描url.txt文件,然后判断里面的URL是否失效。url.txt文件的内容是一行一个URL,如:

代码如下:

http://www.baidu.com

http://www.google.com


http://www.

单进程实现

那么shell脚本scanUrl.sh可以这样写:

代码如下:

#!/bin/bash
#判断是否有参数
if [ $# != 1 ] ;then
        echo "The parameters you enter is not correct !";
        exit -1;
fi

#循环读出URL并判断状态码
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 "执行结束"


那么可以执行下面的命令扫描:
代码如下:

/bin/sh scanUrl.sh url.txt

但这样脚本执行非常慢,一万个URL几个小时都扫描不完。

多进程实现


改成多进程实现非常简单,只需要在do后面的大括号加 & 符号,在done后面加一个wait,表示父进程等待子进程退出后再退出

代码如下:

#!/bin/bash
#判断是否有参数
if [ $# != 1 ] ;then
        echo "The parameters you enter is not correct !";
        exit -1;
fi

#循环读出URL并判断状态码
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 "执行结束"


这样就能多进程并发执行了,但有个问题是进程会一下子非常多,几百上千,超过系统限制报错,下面我们就加上进程数控制。

多进程实现并控制进程数

代码如下:

#!/bin/bash
#允许的进程数
THREAD_NUM=200
#定义描述符为9的管道
mkfifo tmp
exec 9tmp
#预先写入指定数量的换行符,一个换行符代表一个进程
for ((i=0;i&9
done

if [ $# != 1 ] ;then
        echo "The parameters you enter is not correct !";
        exit -1;
fi

while read line
do
{
    #进程控制
    read -u 9
    {
        #isok=`curl -I -o /dev/null -s -w %{http_code} $line`
        if [ "$isok" = "200" ]; then
            echo $line "OK"
        else
            echo $line "no"
        fi
        echo -ne "n" 1>&9
    }&
}
done < $1
wait
echo "执行结束"
rm tmp


上面的代码就可以保证子进程在指定数量了,其进程控制原理是通过管道实现的,当管道无内容可读时就不会执行
代码如下:

{
    #isok=`curl -I -o /dev/null -s -w %{http_code} $line`
    if [ "$isok" = "200" ]; then
        echo $line "OK"
    else
        echo $line "no"
    fi
    #写入一个换行符
    echo -ne "n" 1>&9
}&

而且每个进程执行完成后都会向管道写入一个换行符,从而保证进程数是指定的。

这样就能达到我们的目的了。


    
 
 

您可能感兴趣的文章:

  • Shell有没有多线程,怎么使用?!
  • Linux中使用Shell脚本查看Java线程的CPU使用情况
  • linux bash shell命令:文本搜索工具Grep命令选项及实例
  • C++实现简单的希尔排序Shell Sort实例
  • linux bash shell中case语句的实例
  • 如何使用shell脚本替换不确定文本信息?实例!
  • Linux命令编辑器Shell编程实例大全 下载
  • shell监控脚本实例—监控mysql主从复制
  • Shell中的循环语句for、while、until实例讲解
  • 通过实例深入理解linux shell数组
  • linux shell流程控制语句实例讲解(if、for、while、case语句实例)
  • shell中的循环语句、判断语句实例
  • 总结的7个shell字符串操作方法和实例分享
  • shell数组常用实例分享
  • Shell中处理包含空格的文件名实例
  • Shell脚本test命令使用总结和实例
  • Shell脚本处理浮点数的运算和比较实例
  • shell编程实例研讨:有兴趣者请进!
  • shell常用重定向实例讲解
  • shell使用mysqld_multi自动做多实例从库脚本
  • Shell脚本编程中常用的数学运算实例
  • 备份shell脚本实例代码
  • shell脚本连接、读写、操作mysql数据库实例
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 紧急求救!!!!如何在shell脚本中,执行对mysql的操作
  • 急问:!!如何使用shell作如下操作?
  • shell命令操作快捷方式咨询
  • shell编程急问!关于数据库操作的。
  • Shell能否进行文件的读、写操作~?
  • shell的串行操作问题
  • 怎样在shell中调用ping,traceroute命令,并对读取文件中的地址进行操作?
  • 以普通用户的身份登陆到unix,能不能调用shell执行特定的操作?
  • 请问shell中如何模拟响应一个键盘操作
  • 【在线急等求助】UNIX-shell程序,对文本文件进行操作
  • shell中屏显和写文件同时操作的命令是什么?
  • UNIX的SHELL中如何实现如下操作???
  • Unix Shell 操作,用什么来代替回车符?
  • shell中字符串的替换操作
  • shell 对字符串进行正则操作
  • shell 字符串操作中的 {:-}
  • 在linux操作系统下,编写shell脚本实现分区挂载
  • linux~shell~如何对某一目录下的某一类文件进行一个一个的操作呢
  • shell脚本 实现操作
  • shell读取文件,并对内容进行操作
  • Centos6下安装Shell下文件上传下载rz,sz命令
  • 不同类型的shell*(K SHELL , C SHELL) 用命令怎么切换?
  • linux bash shell命令:grep文本搜索工具简介
  • 我在执行shell时,想在shell里直接向mysql数据库插入数据,我该如何写shell。
  • Linux下指定运行时加载动态库路径及shell下执行程序默认路径
  • 菜鸟问问题:shell是什么呢?普通的ls、cp、pwd这些命令算不算shell呢?如何把自己写的文件变成shell呢?
  • linux bash shell命令:文本搜索工具grep中用于egrep和 grep -E的元字符扩展集
  • 傻瓜问题,请问shell编程和shell脚本编程的关系
  • linux bash shell命令:文本搜索工具grep正则表达式元字符集(基本集)
  • shell变量和子shell的问题请教
  • 请问“当前shell”和“子shell”的区别?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3