首页 > 系统相关 >shell 并行执行

shell 并行执行

时间:2023-02-09 12:55:37浏览次数:54  
标签:10 shell echo 管道 循环 sleep 并行执行

目录

shell 并行执行

串行改为并行

这是常规串行例子

>  for i in `seq 1 10`
do
    sleep 1; echo $i
done 

这是一个迭代次数为10的循环,每一个循环都会等待 1 秒,执行总时长约等于 10 秒。sleep 1 会阻塞循环,只有 sleep 1 执行结果,才会进入下一循环,这是典型的串行模式

shell 提供了一种把命令提交到后台任务队列的机制,即使用 命令 & 将命令控制权交到后台并立即返回执行下个任务。

>  for i in `seq 1 10`
do
    sleep 1 &; echo $i
done

并行-等待模式

上面将串行循环改为并行循环的例子,并没考虑这样的情况。

>  for i in `seq 1 10`
do
    sleep 1 &; echo $i
done
echo "all weakup"

这个例子要求在 for 循环中的所有命令(sleep 1)都执行完之后,打印 “all weakup”。如果按照这段脚本,发现情况并不是这样的,因为 for 循环不会等待 sleep 命令执行结束后才结束,而是把命令提交给系统后自己就退出了,进而还没有1个 sleep 执行完毕之前,“all weakup” 就已经打印了。

为了达到题目要求,需要在 echo "all weakup" 命令之前,加上 wait命令,意为等待上面所有 & 作用过的后台任务执行结束后才继续往下。

>  for i in `seq 1 10`
do
    sleep 1 &; echo $i
done
wait
echo "all weakup"

利用命名管道来做任务队列

大致原理是创建一个 FIFO 命名管道来做为队列,先放进一定量的字符到这个管道做为信号。然后在一个 for 循环中,每循环一次,从管道中读取一个字符信号,提交一个后台任务,并往这个管道中追加一个字符信号,保持管道中的字符信号数量。

是不是很像golang 中的 chan。没有接触过命名管理、文件描述符等概念的,可能会比较难以理解下面示例中的部分细节。

_fifofile="$$.fifo"
mkfifo $_fifofile     # 创建一个FIFO类型的文件
exec 6<>$_fifofile    # 将文件描述符6写入 FIFO 管道, 这里6也可以是其它数字
rm $_fifofile         # 删也可以,

degree=4  # 定义并行度

#根据并行度设置信号个数
#事实上是在fd6中放置了$degree个回车符
for ((i=0;i<${degree};i++));do
    echo
done >&6

for i in `seq 1 20` # 循环20次
do
    # 从管道中读取(消费掉)一个字符信号
    # 当FD6中没有回车符时,停止,实现并行度控制
    read -u6
    {
        sleep 1  # 实际任务的命令
        echo $i
        echo >&6 # 当进程结束以后,再向管道追加一个信号,保持管道中的信号总数量
    } &
done

wait # 等待所有任务结束

exec 6>&- # 关闭管道

文档转自

如何在 shell 中实现并行执行

标签:10,shell,echo,管道,循环,sleep,并行执行
From: https://www.cnblogs.com/liwenchao1995/p/17104911.html

相关文章

  • 火爆全网的全自动getshell工具
    火爆全网的全自动getshell工具,是一款快速方便进行webshell扫描的工具,不同于以前的getshell批量工具,它根据内置常见的exp漏洞、市面较的50多种exp,更好的检测网站漏洞、只要......
  • 2023批量getshell工具
    2023批量getshell工具,是一款快速方便进行扫描的工具,不同于以前的getshell批量工具,它根据内置常见的exp漏洞、市面较的50多种exp,更好的检测网站漏洞、只要网站存在内置的exp......
  • 100 行 shell 写个 Docker
    作者:vivo互联网运维团队-HouDengfeng本文主要介绍使用shell实现一个简易的Docker。一、目的在初接触Docker的时候,我们必须要了解的几个概念就是Cgroup、Namespace......
  • 【Shell】变量
    目录Shell变量系统环境变量Shell的配置文件分类Shell变量变量用于存储管理临时的数据,这些数据都是在运行内存中的变量类型系统环境变量自定义变量特殊符......
  • 【Shell】脚本编写与执行
    目录shell脚本编写规范脚本文件后缀名规范首行格式规范注释格式初写脚本小案例脚本文件的常用执行3种方式sh解析器执行方式bash解析器执行方式仅路径执行方式三种执行方式......
  • 20 shell文本处理工具
          获取第一列,以“”空格为分隔符                          综合案例:  查看当前所有用户......
  • shell关闭buffer执行命令
    前言当执行一些二进制文件时,发现有日志丢失的情况,后来知道是输出到buffer中,换行会将buffer中的内容输出到控制台,而如果没有换行那么会输出到buffer中。一个例子#include<......
  • 在windows系统下用vscode构造shell脚本IDE
    1.基础环境搭建安装VisualStudioCode(VScode)下载地址:https://code.visualstudio.com/Download下载完双击文件,选择路径安装即可,安装过程中有一步需要注意:①将“通过......
  • 16 shell流程控制命令
      加x避免为空:            脚本:   运行:              (())双小括号内部可以写任何数学式子,使用<=......
  • 14.shell概念
                 直接写·文件名容易被认为是命令,需要写成./文件名     直接敲bash会生成子shell,此时输入其他命令是在子shell中进行......