文档章节

关于Linux shell多线程控制无效的bug

Adel
 Adel
发布于 2016/01/26 17:16
字数 666
阅读 116
收藏 4

    shell的多线程编程代码网上有很多,示例代码如下:

thead_num=5 #设置线程数,在这里所谓的线程,其实就是几乎同时放入后台(使用&)执行的进程。 
tmp_fifo_file="/tmp/$$.fifo"  #以进程ID号命名管道文件
mkfifo $tmp_fifo_file   #创建临时管道文件
exec 6<>$tmp_fifo_file  #以读写方式打开tmp_fifo_file管道文件,文件描述符为6,也可以取3-9任意描述符
rm -f $tmp_fifo_file    #删除临时管道文件,也可不删除

for ((i=0;i<$thead_num;i++))   #利用for循环向管道中输入并发数量的空行
do
        echo ""  #输出空行
done >&6  #输出重导向到定义的文件描述符6上

for i in $ip  #循环所有要执行的服务器
do
        read -u6  #从管道中读取行,每次一行,所有行读取完毕后执行挂起,直到管道有空闲的行
                {
                        ......  #线程内的执行代码(如果需要执行时间较长,bug就可能来了)
                        echo "" >&6  #再写入一个空行,使挂起的循环继续执行
                }&  #放入后台执行
done
wait  #等待所有后台进程执行完成
exec 6>&-  #删除文件描述符

    

    问题:之前遇到过一个很惊艳的bug,在用shell写多线程时,线程数量在达到设定的数量之后继续不断增加,多线程控制是无效的,这bug也简直了,我明明给了5个并发,这丫的愣是创建了几十个进程,结果发现查了好多资料,愣是没找到原因,后来发现是我的每个线程处理块的执行时间都比较久,结果,正在 执行的进程还没执行结束,也就是管道中还没有新的空闲的行,系统就新创建了一个新的进程,这看似很不合逻辑。

    解决办法:用“read -u6 -t86400”替换“read -u6”,-t后面的数字表示时间,单位是秒

    原因:具体权威的原因不太确定,根据已知的资料,推测是因为read -u6这条命令的[ -t ]参数是有默认值的,在我的系统里 ,好像是3min,也就是说,如果3min之后,后台进程依然没有执行结束,系统会认为该进程已经执行完毕,继续分配进程。需要特别说明的是,不是所有的系统都需要指定这个[ -t ]参数的,具体跟操作系统有关。以上原因为个人推测,如果有人能够知道真正的原因,还请予以告知,哈哈哈

© 著作权归作者所有

共有 人打赏支持
Adel
粉丝 10
博文 71
码字总数 61751
作品 0
海淀
程序员
私信 提问
[Perl] 关于 Bugzilla 的一些问题与研究

最近碰到一个关系到 Bugzilla 升级与二次开发的项目,对这个大名鼎鼎的缺陷管理系统有了进一步的研究,主要研究内容包括:在不同系统(windows/Linux)上的安装与配置;不同 Bugzilla 系统间...

长平狐
2012/11/19
234
0
请各位大神推荐几本书籍.

一本javascript:比较全面,而却可以有很多实例. 一本linux:书中还要有比较细节的对shell讲解的部分. 非常感谢.请各位前辈推荐一下啊. 还有关于php多线程等,mysql千万级查询有没有这些方面的...

ffvsnn520
2013/10/19
205
6
基于 C++ 的 Java 虚拟机 - YVM

中文 | English YVM是用C++写的一个Java虚拟机,现在支持Java大部分功能,以及一个基于"标记清除算法"的并发垃圾回收器. 不过还有很多bug等待修复。 感兴趣的朋友pull request/fork/star吧!...

racaljk
08/20
0
0
开发测试中bugfree的安装和应用

开发中发现提交bug是麻烦的事情,所有打算用bugfree工具。 一:安装:安装BugFree 3前需要部署配置PHP, Apache Http Server, MySQL环境 1:我选择了XAMPP集成开发环境快速部署(xampp是lampp...

EDIAGD
2013/07/07
0
0
Linux下设置环境JDK环境变量

了解Hadoop有一段时间了可惜学java web好忙,一直没有时间搭建Hadoop,Linux下的环境今天搭建一下Linux下的hadoop安装环境。可惜好久都不用Linux,刚刚用vmware安装了centos5.5,linux上的j...

cloudyak
2013/01/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SAP订单编排和流程增强概述

SAP产品里的订单处理,无论是On-Premises解决方案还是云产品,我认为归根到底可以概括成四个字:订单编排,包含两个层次的内容: 1. 单个订单通过业务流程或者工作流驱动的状态迁移; 2. 多种...

JerryWang_SAP
11分钟前
0
0
Tomcat shutdown.sh不能关掉tomcat进程的解决方法

Tomcat shutdown.sh不能关掉tomcat进程的解决方法 2018年08月14日 16:21:55 脚踏一方土 阅读数:184 标签: Tomcat 更多 个人分类: Tomcat 版权声明:本文为博主原创文章,未经博主允许不得...

linjin200
18分钟前
0
0
Linux添加PYTHONPATH方法以及3种修改环境变量方法

在用Linux(OS:Centos 7.2)时看到有一行代码是: export PYTHONPATH=$PYTHONPATH:/home/usrname/models:/home/usrname/models/one 意思是将models以及其目录下的one文件夹加入系统环境中。 ...

dragon_tech
21分钟前
0
0
redis数据结构

redis不只是一个简单的键(key)-值(value)数据库,实际上它是一个数据结构服务器,支持各种类型的值。也就是说,在传统的键-值数据库中,你把字符串键与字符串值联系起来,而在redis,值不仅限...

hblt-j
23分钟前
2
0
MySQL事务的的介绍及使用

1. 事务的特性 1.1 原子性(Atomicity): 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 1.2. 一致性(Consistency): 在一个事务中,事务的前后数据的完...

kuchawyz
29分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部