我们一起来学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的并发及并发控制的更多相关文章

  1. 我们一起来学Shell - shell的函数

    文章目录 定义函数 执行不带参数的函数 执行带参数的函数 函数的执行总结 我们一起来学Shell - 初识shell 我们一起来学Shell - shell的变量 我们一起来学Shell - shel ...

  2. 我们一起来学Shell - shell的数组

    文章目录 什么是数组 数组中常用变量 数组的定义 小括号定义数组变量 小括号加键值对定义数组变量 分别定义数组变量 动态地定义数组变量 数组赋值的切片 遍历数组 关联数组 我们一起来学Shell - ...

  3. 我们一起来学Shell - shell的循环控制

    文章目录 Shell 循环之 for 语句 Shell 循环之 while 语句 Shell 循环之 until 语句 Shell 循环控制 break指令 continue 指令 exit 指令 s ...

  4. 我们一起来学Shell - shell的条件判断

    文章目录 Shell 条件测试语法 符号说明 Shell 测试表达式 文件测试表达式 字符串测试表达式 整数操作符 逻辑操作符 测试表达式的区别总结 Shell 条件判断之if语句 单分支 IF 条件 ...

  5. Shell 脚本进程并发&进程数控制

    Shell 都以串行的方式自上而下执行命令,不适用需要大量作业的场景. 学习此篇shell脚本进程并发,能够大大提高工作效率~ 通过wait 和 & 后台符号 可以实现并行,但无法控制进程数. ...

  6. [转帖][Bash Shell] Shell学习笔记

    [Bash Shell] Shell学习笔记 http://www.cnblogs.com/maybe2030/p/5022595.html  阅读目录 编译型语言 解释型语言 5.1 作为可执行程序 ...

  7. 刷题记录:[De1ctf] shell shell shell

    目录 刷题记录:[De1ctf] shell shell shell 一.知识点 1.源码泄露 2.正则表达式不完善导致sql注入 3.soapclient反序列化->ssrf 4.扫描内网 5 ...

  8. SDK/JDK,Shell/Shell脚本,Apache/APR ,MTK

    SDK 软件开发工具包(SoftwareDevelopmentKit) API(Application Programming Interface,应用编程接口)其实就是操作系统留给应用程序的一个调用 ...

  9. 以练代学之shell入门(一)

    5年前的时候,开始接触linux操作系统,接触的第一步就是学习shell脚本.用小脚本以连代学入了门. 1) 9*9乘法输出 2) 检验主机的服务是否启动 3) 冒泡排序 4) 备份当时team服务器 ...

随机推荐

  1. PPT2010初识

    原文链接:https://www.toutiao.com/i6486689592241029645/ 一.认识PPT PPT是PowerPoint简称,主要用于演示文稿的创建,即幻灯片的制作演示软件. ...

  2. Termux搭建hexo博客并部署到GitHub

    Termux搭建hexo博客并部署到GitHub 安装 termux-change-repo apt update apt install git && nodejs &&am ...

  3. SQL语句的分类:DQL、DML、DDL、DCL、TCL的含义和用途

    MySQL中提供了很多关键字,将这些关键字 和 数据组合起来,就是常说的SQL语句,数据库上大部分的操作都是通过SQL语句来完成.日常工作中经常听到 DML.DDL语句这些名词,使用字母缩写来表达含义 ...

  4. 【算法】Manacher算法

    最长回文串问题 manacher算法是用来求解最长回文串的问题.最长回文串的解法一般有暴力法.动态规划.中心扩展法和manacher算法. 暴力法的时间复杂度为\(O(n^3)\),一般都会超时: 动 ...

  5. 【小记录】利用cuvid库做视频解码,运行出现"dlopen "libnvcuvid.so" failed!"

    1.查看源码:/Video_Codec_SDK_8.0.14/Samples/common/src/dynlink_nvcuvid.cpp 其中的LOAD_LIBRARY函数的源码如下: 1 #eli ...

  6. CMake语法—普通变量与函数(Normal Variable And Function)

    目录 CMake语法-普通变量与函数(Normal Variable And Function) 1 CMake普通变量与函数示例 1.1 CMakeLists.txt 1.2 执行CMake配置脚本 ...

  7. 字符串工具类ToStringBuilder常用方法介绍

    一.简介与引入   1.ToStringBuilder.HashCodeBuilder.EqualsBuilder.ToStringStyle.ReflectionToStringBuilder.Co ...

  8. Docker 实操

    ---恢复内容开始--- 一.简介 Linux容器作为一类操作系统层面的虚拟化技术成果,旨在立足于单一Linux主机交付多套隔离性Linux环境.与虚拟机不同,容器系统并不需要运行特定的访客操作系统. ...

  9. linux下查看开放的端口

    Nmap是一款针对大型网络的端口扫描工具,它也适用于单机扫描,它支持很多扫描,也同时支持性能和可靠性统计. [root@localhost ~]# yum install namp [root@loc ...

  10. 了解promise、promise对象

    Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和更强大.它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象. 所谓Pr ...