文档章节

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

Adel
 Adel
发布于 2016/01/26 17:16
字数 666
阅读 107
收藏 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
海淀
程序员
基于 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
Java程序运行、停止Shell脚本

碰到这样一个问题——用Java程序来控制shell脚本的运行和停止。具体来讲,这个Java程序至少要有三个功能: 运行Shell脚本; 等待Shell脚本执行结束; 停止运行中的Shell程序; 从功能需求来看...

laigous
2015/11/17
0
1
Linux下设置环境JDK环境变量

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

cloudyak
2013/01/25
0
0
[Perl] 关于 Bugzilla 的一些问题与研究

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

长平狐
2012/11/19
220
0

没有更多内容

加载失败,请刷新页面

加载更多

记一次winserver2003系统,https无法访问,内存占用持续增加,解决办法

先交代一下环境: win server2003系统,系统装在hyper-v虚拟机里 大概2016年底的镜像,距离今天两年左右 病症:大概9月10号左右用这个镜像还可以访问https,但是今天用这个镜像新装的系统,就...

阳阳露
29分钟前
3
0
jdbc连接orcal数据库

import java.sql.Connection;  import java.sql.DriverManager;  import java.sql.ResultSet;  import java.sql.SQLException;  import java.sql.Statement;    ......

小橙子的曼曼
54分钟前
1
0
Vue学习资料

一直以为Vue是依赖nodejs的。 作为前端也可以耦合性就很低了。 //npm包管理器 进行管理npm install vue//初始化一个项目vue init//本地调试npm run dev//编译完成 ...

大灰狼wow
今天
1
0
fullcalendar重新渲染

uiCalendarConfig.calendars.lesson_calendar.fullCalendar('removeEvents');var ym = uiCalendarConfig.calendars.lesson_calendar.fullCalendar('getView').title;$scope.get_lesson(y......

人来疯啊
今天
1
0
多渠道打包总结

https://www.jianshu.com/p/2130db7584c8 https://blog.csdn.net/u011153817/article/details/50772496...

塔塔米
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部