我们一起来学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服务器 ...
随机推荐
- Servlet初级学习加入数据库操作(二)
源代码地址:https://url56.ctfile.com/f/34653256-527822631-2e255a(访问密码:7567) 将页面中的数据逐步替换为数据库管理 准备一个连接数据库的类 ...
- PPT变为gif效果
原文链接:https://www.toutiao.com/i6496812863263343117/ 首先我们点击"文件按钮" 在下拉列表中选择"另存为" 在& ...
- vue3.0+vite+ts项目搭建--基础配置(二)
集成vue-router 使用yarn yarn add vue-router@next --save 安装完成之后在src目录下创建文件夹router/index.ts,创建完成之后需要在Vue-R ...
- SSRF漏洞用到的其他协议(dict协议,file协议)
0x00 引言 当SSRF打内网reids时,若gopher协议用不了,我们也可以用其他协议 0x01 dict协议一.定义:词典网络协议,在RFC 2009中进行描述.它的目标是超越Webster ...
- java基础01-03-注释、标识符、数据类型讲解
java基础01-注释 java中的注释有三种: 单行注释 多行注释 文件注释 public class helloworld { public static void main(String[] a ...
- 【解决了一个小问题】golang protocol buffers 3中去掉json标签中的omitempty
参考了这篇帖子:golang protobuf从生成的json标记中删除omitempty标记 由于是在windows上开发,因此写了一个python脚本来解决: remove_tag.py impo ...
- 一段关于java NIO server端接受客户端socket连接;演示了关于channel,selector等组件的整合使用
public class ReactorDemo { public static void main(String[] args) throws IOException { ServerSocketC ...
- gin框架中的中间件
全局中间件 所有请求都经过此中间件 中间件中设置值 func MiddleWare() gin.HandlerFunc { return func(context *gin.Context) { t ...
- ApacheCN PHP 译文集 20211101 更新
PHP 入门指南 零.序言 一.PHP 入门 二.数组和循环 三.函数和类 四.数据操作 五.构建 PHP Web 应用 六.搭建 PHP 框架 七.认证与用户管理 八.建立联系人管理系统 使用 PH ...
- 面向计算机视觉的深度学习 | iBooker·ApacheCN
原文:Deep Learning for Computer Vision 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 不要担心自己的形象,只关心如何实现目标.--<原则>,生 ...