我们一起来学Shell - shell的并发及并发控制
我们一起来学Shell - 初识shell
我们一起来学Shell - shell的变量
我们一起来学Shell - shell的条件判断
我们一起来学Shell - shell的循环控制
我们一起来学Shell - shell的数组
我们一起来学Shell - shell的函数
我们一起来学Shell - shell的并发及并发控制
我们一起来学Shell - 正则表达式
bash的并发
默认的情况下,Shell脚本中的命令是串行执行的,必须等到前一条命令执行完后才执行接下来的命令,但是如果我有一大批的的命令需要执行,而且互相又没有影响的情况下(有影响的话就比较复杂了),那么就要使用命令的并发执行了。
未使用并发的脚本
这个脚本是从
etc var dev usr opt home这几个目录下找文件使用
time sh study.sh可以看到,执行这个脚本,需要用到0m4.297s
#!/usr/bin/env bash
arry=(etc var dev usr opt home)
for (( i=0; i<${#arry[@]}; i++ ))
do
find /${arry[i]}/ -type f >& /dev/null
done
echo "complate"
简单修改
使用
time sh study.sh可以看到,执行这个脚本,只需要用到0m0.003s
#!/usr/bin/env bash
arry=(etc var dev usr opt home)
for (( i=0; i<${#arry[@]}; i++ ))
do
{
find /${arry[i]}/ -type f >& /dev/null
} &
done
echo "complate"
这样的话,循环里面的命令是作为后台进程在执行,主进程就不需要等待前面的命令执行完毕后,才执行后面的命令
如果上下两个命令是有依赖关系的,会得到错误的结果,因为上面的命令还没执行完成,就已经开始执行下面的命令了
使用wait命令
使用
time sh study.sh可以看到,执行这个脚本,需要用到0m0.492s
#!/usr/bin/env bash
arry=(etc var dev usr opt home)
for (( i=0; i<${#arry[@]}; i++ ))
do
{
find /${arry[i]}/ -type f >& /dev/null
} &
done
wait
echo "complate"
因为使用了wait,要等循环内的命令执行结束了,才会执行后面的命令,因为虚拟机里面文件比较少,所以测试不出并发的差距,甚至因为使用了wait,导致时间比不并发的时间还要多一丢丢
但是如果数据量很大的话,就需要控制并发进程的个数,以免影响到系统的其他进程运行,导致系统宕机
控制并发进程的数量
以下脚本是利用文件描述符号和命名管道实现多进程并发控制,控制并发数量为5
以下脚本会创建254个用户,并且ping这个网段254次
使用
time sh study.sh可以看到,执行这个脚本,需要用到1m8.744s有兴趣的,可以尝试一下不开启并发,或者不开启并发控制
#!/usr/bin/env bash
ip="192.168.100."
use="test"
# 定义并发数量
thread=5
# 以当前进程 pid 创建 fifo 文件,防止冲突
tmp_fifofile=/tmp/$$.fifo
mkfifo ${tmp_fifofile}
# 定义当前进程打开管道文件(手动指定打开的文件描述符为8)
exec 8<> ${tmp_fifofile}
# 删除管道文件(当前进程没有释放文件描述符8,不影响)
rm ${tmp_fifofile}
# 往管道文件(文件描述符8)里循环写入内容
for i in $(seq ${thread})
do
# 给管道文件(文件描述符8)输入${thread}个回车
#(写入任何记录都可以,内容不重要,添加${thread}条记录.重定向,追加都可以,管道文件内容不会被覆盖)
echo >&8
done
for i in {1..254}
do
# read -u 读取一次文件描述符的内容
#(read 读取不到内容就停止,管道文件只能读取一次,限制读取${thread}次)
read -u 8
{
useradd ${use}$i
echo "111" | passwd --stdin ${use}$i &>/dev/null
if [ $? -eq 0 ]; then
echo "$use$i is created"
fi
ping -c1 -W1 $ip$i &>/dev/null
if [ $? -eq 0 ]; then
echo "$ip$i is up"
else
echo "$ip$i is down"
fi
# 给管道文件(描述符号8)写入一个回车(还会一条记录,内容随意)
echo >&8
} &
done
wait
exec 8<&-
echo "complate"
文件描述符
- fd 进程打开的文件
查看当前进程打开的文件
ll /proc/$$/fd
自定义当前进程用描述符号操作文件
- 手动定义文件描述符,只要没有被占用可以使用
- 自定义用当前进程打开一个文件,描述符为6
exec 6<> /file
- 自定义用当前进程关闭一个文件,描述符为6
exec 6<&-
管道
匿名管道不能跨终端 (| 管道)
命名管道
- 创建命名管道文件(不是普通文件,管道内的文件只能读取一次,不会永久保存)
mkfifo /tmp/fifo1
- 查看命名管道文件
cat /tmp/fifo1
我们一起来学Shell - shell的并发及并发控制的更多相关文章
- 我们一起来学Shell - shell的函数
文章目录 定义函数 执行不带参数的函数 执行带参数的函数 函数的执行总结 我们一起来学Shell - 初识shell 我们一起来学Shell - shell的变量 我们一起来学Shell - shel ...
- 我们一起来学Shell - shell的数组
文章目录 什么是数组 数组中常用变量 数组的定义 小括号定义数组变量 小括号加键值对定义数组变量 分别定义数组变量 动态地定义数组变量 数组赋值的切片 遍历数组 关联数组 我们一起来学Shell - ...
- 我们一起来学Shell - shell的循环控制
文章目录 Shell 循环之 for 语句 Shell 循环之 while 语句 Shell 循环之 until 语句 Shell 循环控制 break指令 continue 指令 exit 指令 s ...
- 我们一起来学Shell - shell的条件判断
文章目录 Shell 条件测试语法 符号说明 Shell 测试表达式 文件测试表达式 字符串测试表达式 整数操作符 逻辑操作符 测试表达式的区别总结 Shell 条件判断之if语句 单分支 IF 条件 ...
- Shell 脚本进程并发&进程数控制
Shell 都以串行的方式自上而下执行命令,不适用需要大量作业的场景. 学习此篇shell脚本进程并发,能够大大提高工作效率~ 通过wait 和 & 后台符号 可以实现并行,但无法控制进程数. ...
- [转帖][Bash Shell] Shell学习笔记
[Bash Shell] Shell学习笔记 http://www.cnblogs.com/maybe2030/p/5022595.html 阅读目录 编译型语言 解释型语言 5.1 作为可执行程序 ...
- 刷题记录:[De1ctf] shell shell shell
目录 刷题记录:[De1ctf] shell shell shell 一.知识点 1.源码泄露 2.正则表达式不完善导致sql注入 3.soapclient反序列化->ssrf 4.扫描内网 5 ...
- SDK/JDK,Shell/Shell脚本,Apache/APR ,MTK
SDK 软件开发工具包(SoftwareDevelopmentKit) API(Application Programming Interface,应用编程接口)其实就是操作系统留给应用程序的一个调用 ...
- 以练代学之shell入门(一)
5年前的时候,开始接触linux操作系统,接触的第一步就是学习shell脚本.用小脚本以连代学入了门. 1) 9*9乘法输出 2) 检验主机的服务是否启动 3) 冒泡排序 4) 备份当时team服务器 ...
随机推荐
- python中join()方法介绍
描述 Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串. 语法 join()方法语法:str.join(sequence) 参数 sequence -- 要连接的元 ...
- Solon Web 开发,四、请求上下文
Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...
- 1月29日 体温APP开发记录
1.阅读构建之法 现代软件工程(第三版) 2.观看Android开发视频教程最新版 Android Studio开发 3.高德地图API下载获取key
- 【解决了一个小问题】golang protocol buffers 3中去掉json标签中的omitempty
参考了这篇帖子:golang protobuf从生成的json标记中删除omitempty标记 由于是在windows上开发,因此写了一个python脚本来解决: remove_tag.py impo ...
- 记录未解决的问题:docker中无法启动mysqld
首先在docker中安装mysql server的包: sudo yum install mysql sudo yum install mariadb-server mariadb /usr/libe ...
- MIME类型说明(HTTP协议中数据类型)
MIME(HTTP协议中数据类型) MIME:多功能Internet邮件扩充服务.MIME类型的格式是"大类型/小类型",并与某一种文件的扩展名相对应. 常见的MIME类型: RT ...
- 集合框架-工具类-JDK5.0特性-静态导入
1 package cn.itcast.p4.news.demo; 2 3 import java.util.ArrayList; 4 //import java.util.Collections; ...
- ☕【Java深层系列】「并发编程系列」让我们一起探索一下CyclicBarrier的技术原理和源码分析
CyclicBarrier和CountDownLatch CyclicBarrier和CountDownLatch 都位于java.util.concurrent这个包下,其工作原理的核心要点: Cy ...
- python os模块 文件操作
Python内置的os模块可以通过调用操作系统提供的接口函数来对文件和目录进行操作 os模块的基本功能: >>> import os >>> os.name 'po ...
- 人口信息普查系统-JavaWeb-四
今天给大家分享前端人口登记页面,人口查询页面 人口登记 <%@ page language="java" contentType="text/html; chars ...