• shell中wait命令详解


    wait命令介绍

      wait [作业指示或进程号]

      1.等待作业号或者进程号制定的进程退出,返回最后一个作业或进程的退出状态状态。如果没有制定参数,则等待所有子进程的退出,其退出状态为0.

      2.如果是shell中等待使用wait,则不会等待调用函数中子任务。在函数中使用wait,则只等待函数中启动的后台子任务。

      3.在shell中使用wait命令,相当于高级语言里的多线程同步。

      语法

      wait(参数)   使用 wait 是在等待上一批或上一个脚本执行完(即上一个的进程终止),再执行wait之后的命令。

      参数

      进程或作业标示:指定进程号或者作业号。

      实例

      1.使用wait等待所有子任务结束。

      [plain] view plain copy#!/bin/bash

      sleep 10 &

      sleep 5&

      wait #等待10秒后,退出

      [plain] view plain copy#!/bin/bash

      sleep 10 &

      sleep 5&

      wait $! #$!表示上个子进程的进程号,wait等待一个子进程,等待5秒后,退出

      2.在函数中使用wait

      [plain] view plain copy#!/bin/bash

      source ~/.bashrc

      fun(){

      echo "fun is begin.timeNum:$timeNum"

      local timeNum=$1

      sleep $timeNum &

      wait #这个只等待wait前面sleep

      echo "fun is end.timeNum:$timeNum"

      }

      fun 10 &

      fun 20 &

      wait #如果fun里面没有wait,则整个脚本立刻退出,不会等待fun里面的sleep

      echo "all is ending"

      输出结果为:

      [plain] view plain copyfun is begin.timeNum:10

      fun is begin.timeNum:20

      fun is end.timeNum:10

      fun is end.timeNum:20

      all is ending

      从输出结果,可以看到,整个脚本,等待了所有子任务的退出

    #!/bin/bash
    for ((i=0;i<5;i++))
    do
    sleep 3;echo a
    done
    
    #运行需要15秒。
    
    
    #!/bin/bash
    for ((i=0;i<5;i++))
    do
    {
    sleep 3;echo a
    } &
    done
    wait
    
    #打开5个子进程并行,运行只需要3秒。
    复制代码

    例3:

    用管道fifo文件来处理并发,本例转自https://my.oschina.net/sanpeterguo/blog/133304

    本例让博主学到很多,用到管道,read -u,exec的相关知识,后续博客陆续更新。

    复制代码
    #!/bin/bash
    #author :  peterguo@tencent.com
    #date   :  2013.05.24
    
    
    #sub process do something
    function a_sub_process { 
        echo "processing in pid [$$]"
        sleep 1
    }
    
    
    #创建一个fifo文件
    FIFO_FILE=/tmp/$.fifo
    mkfifo $FIFO_FILE
    
    
    #关联fifo文件和fd6
    exec 6<>$FIFO_FILE      # 将fd6指向fifo类型
    rm $FIFO_FILE
    
    
    #最大进程数
    PROCESS_NUM=4
    
    
    #向fd6中输入$PROCESS_NUM个回车
    for ((idx=0;idx<$PROCESS_NUM;idx++));
    do
        echo
    done >&6 
    
    
    #处理业务,可以使用while
    for ((idx=0;idx<20;idx++));
    do
        read -u6  #read -u6命令执行一次,相当于尝试从fd6中获取一行,如果获取不到,则阻塞
        #获取到了一行后,fd6就少了一行了,开始处理子进程,子进程放在后台执行
        {
          a_sub_process && { 
             echo "sub_process is finished"
          } || {
             echo "sub error"
          }
          #完成后再补充一个回车到fd6中,释放一个锁
          echo >&6 # 当进程结束以后,再向fd6中加上一个回车符,即补上了read -u6减去的那个
        } &
    done
    
    
    #关闭fd6
    exec 6>&- 
  • 相关阅读:
    未设置BufferSize导致FTP下载速度过慢的问题
    Ant Problem: failed to create task or type foreach 问题
    关于iOS Tabbar的一些设置
    eeplat开发平台概念理解
    swift菜鸟入门视频教程-05-控制流
    iOS多线程与网络开发之多线程概述
    hdu 1686 Oulipo
    记一次理想浪漫的毕旅
    LeetCode:Subsets II
    DNA分子结构3D模型
  • 原文地址:https://www.cnblogs.com/klb561/p/10740995.html
Copyright © 2020-2023  润新知