文档章节

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

Adel
 Adel
发布于 2016/01/26 17:16
字数 666
阅读 99
收藏 4
点赞 1
评论 0

    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
博文 70
码字总数 61751
作品 0
海淀
程序员
嵌入式Linux学习基础规划篇

嵌入式的学习是需要日积月累的,是通过一点一滴的积累才能成为大神。下面来介绍一下嵌入式linux学习基础规划,目标是达到适应嵌入式应用软件开发、嵌入式系统开发或嵌入式驱动开发的基本素质...

创客学院 ⋅ 04/10 ⋅ 0

GNOME 3.28.2 发布:修复内存泄漏

GNOME项目的Matthias Clasen几小时前宣布了GNOME 3.28桌面环境的第二个和最后一个定期发布版本的普遍可用性。在第一个版本发布一个月之后,GNOME 3.28.2在这里提供了更多的bug修复和改进,使...

linux-tao ⋅ 05/25 ⋅ 0

//Build 2018 大会上关于 Windows Linux 子系统的回顾

微软 Build 2018 开发者大会已经结束,在这篇文章中,我们将和大家一起回顾在大会期间关于 Windows Linux 子系统(WSL)的新消息。 Ubuntu 18.04 已正式上架 Microsoft Store 现在我们可以通过...

局长 ⋅ 05/22 ⋅ 0

如何在 Windows 10 上开启 WSL 之旅

WSL 可以让你访问 Windows 上的 Linux Bash shell。 在 上一篇文章 中,我们讨论过关于 Windows 的子系统 LinuxWindows Subsystem for Linux(WSL)的目标用户。本文,我们将在 Windows 10 的...

作者: Swapnil Bhartiya ⋅ 04/15 ⋅ 0

如何在 Windows 10 上开启 Linux子系统

WSL 可以让你访问 Windows 上的 Linux Bash shell,在 上一篇文章 中,我们讨论过关于 Windows 的子系统 LinuxWindows Subsystem for Linux(WSL)的目标用户,本文,我们将在 Windows 10 的...

问题终结者 ⋅ 04/23 ⋅ 0

Linux基础 30分钟GDB调试快速突破

引言 Linus心灵鸡汤   在*nix开发中有道卡叫gdb调试,不管你怎么搞. 它依然在那丝毫不会松动.今天致敬一个 活着的传奇 Linus Torvalds   Unix 始于上个世纪60年代,在70年代得到了迅猛的发...

xumaojun ⋅ 04/23 ⋅ 0

MySQL下perror工具查看System Error Code信息

原文出处:潇湘隐者 在MySQL数据库的维护过程中,我们有时候会在MySQL的错误日志文件中看到一些关于Operating system error的错误信息,例如在MySQL的错误日志里面,有时候会看到关于 InnoDB...

潇湘隐者 ⋅ 04/25 ⋅ 0

哪里学Linux开发?作业怎么控制Jobs?

使用Ctrl+Z组合键停止shell运行中的作业。停止作业后,Linux系统会让用户终止或重启它。可以使用kill命令终止进程。重启停止的进程需要向它发送SIGCONT信号。 重启、停止、终止和恢复作业的操...

长沙千锋 ⋅ 05/03 ⋅ 0

/etc/security/limits.conf的相关说明

/etc/security/limits.conf的相关说明 通过ulimit -n命令可以查看Linux系统里打开文件描述符的最大值,一般缺省值是1024,对一台繁忙的服务器来说,这个值偏小,所以有必要重新设置linux系统...

linjin200 ⋅ 04/29 ⋅ 0

Shell学习之路和我发布过的Shell脚本博文

Shell学习之路 目录 Shell学习之路【第一篇】:别名,管道,用户配置文件,变量,read Shell学习之路【第二篇】:条件测试,运算符,选择结构,for循环结构 Shell学习之路【第三篇】:While循环,C-...

yht_1990 ⋅ 2016/07/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 30分钟前 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

eclipse酷炫大法之设置主题、皮肤

eclipse酷炫大法 目前两款不错的eclipse 1.系统设置 Window->Preferences->General->Appearance 2.Eclipse Marketplace下载【推荐】 Help->Eclipse Marketplace->搜索‘theme’进行安装 比如......

anlve ⋅ 昨天 ⋅ 0

vim编辑模式、vim命令模式、vim实践

vim编辑模式 编辑模式用来输入或修改文本内容,编辑模式除了Esc外其他键几乎都是输入 如何进入编辑模式 一般模式输入以下按键,均可进入编辑模式,左下角提示 insert(中文为插入) 字样 i ...

蛋黄Yolks ⋅ 昨天 ⋅ 0

大数据入门基础:SSH介绍

什么是ssh 简单说,SSH是一种网络协议,用于计算机之间的加密登录。 如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码...

董黎明 ⋅ 昨天 ⋅ 0

web3j教程

web3j是一个轻量级、高度模块化、响应式、类型安全的Java和Android类库提供丰富API,用于处理以太坊智能合约及与以太坊网络上的客户端(节点)进行集成。 汇智网最新发布的web3j教程,详细讲解...

汇智网教程 ⋅ 昨天 ⋅ 0

谷歌:安全问题机制并不如你想象中安全

腾讯科技讯 5月25日,如今的你或许已经对许多网站所使用的“安全问题机制”习以为常了,但你真的认为包括“你第一个宠物的名字是什么?”这些问题能够保障你的帐户安全吗? 根据谷歌(微博)安...

问题终结者 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部