linux脚本多线程,Shell多线程操作及线程数控制实例

前言

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

需求

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

http://www.baidu.com

http://www.google.com

https://www.jb51.net

单进程实现

那么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 9<>tmp

#预先写入指定数量的换行符,一个换行符代表一个进程

for ((i=0;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

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

{

#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

}&

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Node.js Undocumented(2)

写这种系列blog&#xff0c;是为了监督自己&#xff0c;不然我估计我不会有动力写完。这一节&#xff0c;我将介绍下Buffer这个module。js本身对文本友好&#xff0c;但是处理二进制数据就不是特别方便&#xff0c;因此node.js提供了Buffer模块来帮助你处理二进制数据&#xff…

注册asp.net 4.0 到iis

如果没有按照正常的先装iis后装.net的顺序&#xff0c;可以使用此命令重新注册一下&#xff1a; 32位的Windows&#xff1a;---------------------------------------------------------------------------1. 运行->cmd 2. cd C:\Windows\Microsoft.NET\Framework\v4.0.30…

公开征集 | 每个人都可以成为 COSCon'21 主论坛的开源明星

“ 点击蓝字 / 关注我们 ”| 作者&#xff1a;COSCon21 组委会| 编辑&#xff1a;钱奕| 设计&#xff1a;朱亿钦| 责编&#xff1a;沈于蓝在开源的世界里&#xff0c;我们常常说 Community &#xff1e; Code&#xff08;社区重于代码&#xff09;&#xff0c;Community 一词在…

python怎么处理异常然后继续_Python异常处理-返回行,继续

通常,在try块内触发异常后,您永远都无法将执行返回到特定的代码段,因为该异常可能在很深的某个地方发生,并受其他线程的其他副作用影响的许多其他状态.尽管您的程序可能不是这种情况,但是鉴于没有通用的解决方案允许在Python中进行此操作,因此使用异常处理基本上不可能实现您想…

linux 编写脚本示范,Linux-scripts-简单脚本和脚本的执行

9.Scripts9.1什么是 Shell scriptsshell script 是利用 shell 的功能所写的一个『程序 (program)』&#xff0c;这个程序是使用纯文本文件&#xff0c;将一些 shell 的语法与指令(含外部指令)写在里面&#xff0c;搭配正规表示法、管线命令与数据流重导向等功能&#xff0c;以达…

SQL server 2000 和2005中怎么让ldf文档变小

SQL server 2005 打开数据库-- 新建查询--输入以下两条命令&#xff1a; Dump transaction databasename with no_log backup log databasename with no log --然后选择数据库--收缩--文件-- 选择日志--选择收缩方式里到xxMB,然后就可以了。 en:chose database--shrink-- file-…

MyEclipse JAVA提示信息配置

1.内容提示 1.1 Windows>Preferences>Java>Editor>Content Assists 找到”auto activation triggers for Java“ 输入框&#xff0c;初始为’.&#xff0c;改为‘.abc. 1.2 Export Preferences配置文件取名为’1.epf,编辑‘1.epf’,找到‘.abc,改为’.abcdefghijk…

被质疑“在开源社区执行微软意愿”,.NET 基金会前董事为其提交的 PR 道歉并辞职...

编译&#xff5c;燕珊.NET基金会最近“不太平”。上周五&#xff0c;.NET 基金会执行董事 Claire Novotny 在其成员反对她对其中一个项目的干预后&#xff0c;为自身的行为道歉并宣布辞去职务。巧合的是一个多月前&#xff0c;董事会成员 Rodney Littles II 因与基金会的目标方…

hadoop扩充磁盘操作记录

记录cloudera扩充磁盘1、4台主机&#xff0c;每台主机增加一块2TB的硬盘2、首先简单说明步骤A、分区&#xff0c;挂载&#xff08;挂载目录&#xff08;名称&#xff0c;路径&#xff09;要一致&#xff09;B、在挂载的分区内&#xff0c;建立对应的文件夹&#xff0c;并授权C、…

linux命令clock,简单了解Linux系统中clock命令的使用方法

clock 命令&#xff1a;设置或者显示硬件时间的近似值必要参数--adjust 自动调整硬件时钟时间--debug 运行时&#xff0c;输出详细的处理过程--directisa 不通过设备文件/etc/rtc&#xff0c;直接对硬件时钟进行存取--getepoch 输出硬件时钟的数值到标准输出--hctosys 时钟同步…

单身两年以上是什么体验?

1 单身两年以上是什么体验&#xff1f;2 这群熊孩子&#xff0c;不当演员可惜了。。3 我要出去&#xff01;我要见园长&#xff01;我为幼儿园立过功&#xff01;我为幼儿园卖过萌&#xff01;4 当心&#xff01;陷阱&#xff01;&#xff01;5 一位主人抓拍下了自家的柴犬宝宝…

wince导航_宁可用手机导航,也不用汽车导航?

很多车主朋友在开车的时候&#xff0c;比较青睐的是手机导航而不是汽车导航。笔者我也是一个车主&#xff0c;我在开车的时候也是比较青睐手机导航而不是汽车导航&#xff0c;我认为主要是有以下几个原因&#xff1a;车载导航的准确性没有手机导航的高。很多车载导航的地图是在…

Hibernate 逆向工程生成POJO类和映射文件

Guestbook.java 代码&#xff1a; package com.b510.examplex; import java.util.Date; public class Guestbook implements java.io.Serializable { private static final long serialVersionUID -7004492417383895995L; private Integer id; private String name; private S…

功能导航设计器

本程序使用C#编写&#xff1b;此模块作用为让程序功能使用人员直观的知道程序功能模块的先后顺序和操作的先后顺序&#xff1b;原理为客户端通过设计器设置程序的功能流程&#xff1b;并保存的文件服务器上&#xff1b;在使用人员程序中可以直观的调出程序模块的图示&#xff1…

.Net Core with 微服务 - 使用 AgileDT 快速实现基于可靠消息的分布式事务

前面对于分布式事务也讲了好几篇了&#xff08;可靠消息最终一致性分布式事务 - TCC分布式事务 - 2PC、3PChttps://github.com/kklldog/AgileDT 开源不易&#xff0c;大家多多 ✨✨✨回顾 前面一篇文章(可靠消息最终一致性 )我们详细介绍了基于可靠消息的分布式事务。为了更好的…

一位汉子的恋爱心得

1 每天早上起床的你。。2 喂&#xff0c;你怎么不理我&#xff01;3 最新防撕家方法。。4 塑料姐妹花&#xff0c;离得远显脸小。。心疼左一&#xff01;5 国外一位汉子的恋爱心得……6 当有人跟你说“追星有什么用&#xff0c;那些人也不认识你”。。你点的每个赞&#xff0c;…

linux windows多任务,windows是多用户多任务系统吗?

关于单用户操作系统包括Microsoft的MS DOS&#xff0c;windows 9X(95&#xff0c;98&#xff0c;ME)&#xff0c;windows 2000。根据在同一时间使用计算机用户的多少&#xff0c;操作系统可分为单用户操作系统和多用户操作系统。单用户操作系统是指一台计算机在同一时间只能由一…

放大器非线性失真研究装置_高效布里渊光纤放大器

来源&#xff1a;PTB新闻 主要适用于以下领域&#xff1a;精确的光频传输&#xff0c;例如用于光学时钟的远距离比较 双向放大器对于在长距离光纤链路上传输超稳定的光频必不可少&#xff0c;它们可以补偿光损耗&#xff0c;大约每100千米20 dB。由德国联邦物理技术研究院(PTB)…

利用“多说”制作留言板、评论系统

留言板和评论系统在网站建设中会经常用到&#xff0c;今天为大家介绍如何利用多说来为自己的网站制作留言板、评论系统&#xff01;注意以下只是介绍一下简单的创建设置&#xff0c;更多功能大家可以自己去探索&#xff01; 1、进入多说网站 http://duoshuo.com/ 并且登录。 2、…

JS实现动态显示当前时间(12/24小时制)(转载Mr.Think)

今天又要用到动态显示当前时间,且要求可以切换24/12小时制, 记得很久前写过一个24小时制的,但一时没能找着, 于是又重新写了个,若有需要的朋友自行复制粘贴一份吧. 很简单的一个功能函数,实现方式不多言,用Date()对象获取到当前时间,然后用setTimeout每隔1秒获取最新的时间. 写…