• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >linux shell > Shell多线程操作及线程数控制实例

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

作者:junjie 字体:[增加 减小] 来源:互联网

junjie 通过本文主要向大家介绍了shell 多线程,多线程批量getshell,linux shell多线程,shell 线程,shell脚本实例等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

前言

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

需求

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

http://www.google.com


http://www.jb51.net
</div>

单进程实现

那么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 "执行结束"</div>
那么可以执行下面的命令扫描:
/bin/sh scanUrl.sh url.txt</div>

但这样脚本执行非常慢,一万个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 "执行结束"</div>
这样就能多进程并发执行了,但有个问题是进程会一下子非常多,几百上千,超过系统限制报错,下面我们就加上进程数控制。

多进程实现并控制进程数
#!/bin/bash
#允许的进程数
THREAD_NUM=200
#定义描述符为9的管道
mkfifo tmp
exec 9<>tmp
#预先写入指定数量的换行符,一个换行符代表一个进程
for ((i=0;i<$THREAD_NUM;i++))
do
    echo -ne "\n" 1>&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</div>
上面的代码就可以保证子进程在指定数量了,其进程控制原理是通过管道实现的,当管道无内容可读时就不会执行
{
    #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
}&</div>
而且每个进程执行完成后都会向管道写入一个换行符,从而保证进程数是指定的。

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

</div>

您可能想查找下面的文章:

  • 分享一个入门级可控多线程shell脚本代码
  • Shell多线程操作及线程数控制实例

相关文章

  • Shell使用Epoch进行日期时间转换和计算的几个小函数
  • shell查找符号链接及其指向目标的方法介绍
  • shell脚本监控linux系统内存使用情况的方法(不使用nagios监控linux)
  • Hadoop单机版和全分布式(集群)安装
  • 实现core文件自动生成配置文件的方法
  • linux下监视进程 崩溃挂掉后自动重启的shell脚本
  • Shell脚本实现检查服务器安全状态(用户、登录IP、防火墙检查)
  • unix编程创建前缀固定的临时文件代码分享
  • linux shell命令行选项与参数用法详解
  • 输出执行操作和打印日志的shell脚本实例

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • linux shell命令执行顺序的控制方法
    • Shell脚本实现自动修改IP、主机名等功能分享
    • 批量转换目录下文件编码的shell脚本代码
    • shell写的告警次数控制及恢复示例代码
    • 检测网站down掉后自动发信的shell脚本代码
    • shell实现四则运算简单方法
    • 轻松掌握Linux关机重启命令
    • Shell脚本数组操作小结
    • Shell脚本IF条件判断和判断条件总结
    • Shell中处理包含空格的文件名实例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有