0%

shell 多线程编程和 wait 命令

shell 编程也需要考虑多线程编程及线程见同步,如果处理不好会导致一些诡异的问题。

wait 命令可以进行 shell 的多线程同步控制。

子 shell 启动方式

在执行命令后加 & 操作符,表示将命令放在子 shell 中异步执行。可以达到多线程效果。如下,

sleep 10   #等待 10 秒,再继续下一操作
sleep 10 & #当前 shell 不等待,后台子 shell 等待

wait 命令

wait [pid...]
  1. 等待作业号或者进程号指定的进程退出,返回最后一个作业或进程的退出状态状态。如果没有指定参数,则等待所有子进程的退出,其退出状态为 0.
  2. 如果是 shell 中等待使用 wait,则不会等待调用函数中子任务。在函数中使用 wait,则只等待函数中启动的后台子任务
  3. 在 shell 中使用 wait 命令,相当于高级语言里的多线程同步

example

#!/bin/bash
sleep 10 &
sleep 5&
wait #等待 10 秒后,退出
#!/bin/bash
sleep 10 &
sleep 5&
wait $! #$! 表示上个子进程的进程号,wait 等待一个子进程,等待 5 秒后,退出
#!/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"