shell 编程也需要考虑多线程编程及线程见同步,如果处理不好会导致一些诡异的问题。
wait
命令可以进行 shell 的多线程同步控制。
子 shell 启动方式
在执行命令后加 &
操作符,表示将命令放在子 shell 中异步执行。可以达到多线程效果。如下,
sleep 10 #等待 10 秒,再继续下一操作
sleep 10 & #当前 shell 不等待,后台子 shell 等待
wait 命令
wait [pid...]
- 等待作业号或者进程号指定的进程退出,返回最后一个作业或进程的退出状态状态。如果没有指定参数,则等待所有子进程的退出,其退出状态为 0.
- 如果是 shell 中等待使用 wait,则不会等待调用函数中子任务。在函数中使用 wait,则只等待函数中启动的后台子任务
- 在 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"