我们一起来学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服务器 ...
随机推荐
- List接口的实现类
(一): ArrayList 构造方法 特有的方法: LinkedList 特点: 可以调用Collections类的静态方法 synchronizedCollection转换成线程安全的
- Java日期格式化带来的年份不正确
BUG现场 一个线上项目之前一直运行得很稳定,从没出过数据错误的问题,但是在2021.12.26这天却"意外"地出现了数据计算错误. 刚开始一头雾水,不知道是什么问题,后来经过日志 ...
- Pop Sequeue
题目描述 Given a stack which can keep M numbers at most. Push N numbers in the order of 1,2,3...,N and p ...
- 18个示例详解 Spring 事务传播机制(附测试源码)
什么是事务传播机制 事务的传播机制,顾名思义就是多个事务方法之间调用,事务如何在这些方法之间传播. 举个例子,方法 A 是一个事务的方法,方法 A 执行的时候调用了方法 B,此时方法 B 有无事务以及 ...
- 多种语言tcp编程
再次强调,最好socket编程 c#的tcpclient等封装无法对接android的socket服务器 c#的tcpclient等封装可对接java的socket服务器 python socket服 ...
- TCP可靠性
目录 一:TCP可靠性 1.通过序列号与确认应答提高可靠性 一:TCP可靠性 简介 TCP 通过检验和.序列号.确认应答.重发控制.连接管理以及窗口控制等机制实现可靠性传输. 1.通过序列号与确认应答 ...
- 负载均衡的比例(权重,ip_hash,轮询)
目录 一:负载均衡的比例 1.轮询 2.权重 3.ip_hash 二:测试轮询 1.测试 2.重启 3.网址测试 三:测试ip_hash 一:负载均衡的比例 1.轮询 # 默认情况下,Nginx负载均 ...
- python33day
内容回顾 概念 同步异步阻塞和非阻塞 同步阻塞:调用一个函数需要等待这个函数的执行结果,并且在执行这个函数的过程中CPU不工作 inp=input('>>>') 同步非阻塞:调用一个 ...
- python 小兵(4)之文件操作
文件操作 初始文件操作 使用Python来读写文件是非常简单的操作,我们使用open()函数来打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行各种各样的操作了 根据打开方式的不同能够执行的操作 ...
- Linux中date命令用法
1.以下是服务器现在的时间,当前时间的各种表示方法,表示成自己想要的时间格式,后面的范例将会在这个时间基础之上进行演示,同时这也是熟练掌握后面各种date命令的前提,请读者注意 [root@RHEL6 ...