1.介绍

(1)等待作业号或者进程号的退出(和&命令搭配使用),返回最后一个作业或进程的退出状态。如果没有指定参数,则等待所有子进程的退出,其退出状态为0.

(2)如果是shell中使用wait,不会等待shell函数中调用的后台进程。在shell函数中使用wait,则只等待函数中启动的后台进程。

(3)在shell中使用wait命令不跟参数,相当于是多线程,等待全部线程执行完毕才执行后续命令。

 

2.语法

wait [进程号或作业号]

如果wait后面不带任何的进程号或作业号,那么wait会直至当前shell中进程的所有子进程都执行结束后,才继续执行下一步。

wait 23
wait %1

 

3.实例

(1)使用wait等待所有后台进程结束

# 等待10秒后,退出

#!/bin/bash
sleep 10 &
sleep 5 &
wait

(2)wait等待一个后台进程

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

#!/bin/bash
sleep 10 &
sleep 5 &
wait $!

(3)shell脚本,使用wait控制进程超时时间,kill进程

#!/bin/bash

# 等待时间,单位:s
wait_for=3

# 执行的命令
command=$*
${command} &
command_pid=$!
(sleep ${wait_for} ; kill -9 ${command_pid} > /dev/null 2>&1) &
watch_dog=$!
sleep_pid=$PPID
wait ${command_pid} > /dev/null 2>&1
kill ${sleep_pid} > /dev/null 2>&1

(4)shell脚本,使用多线程例子

一个for循环1000次,循环体里面的每个任务都放入后台运行(在命令后面加&符号代表后台运行)

#!/bin/bash

start_time=$(date +%s)

for ((i=1;i<=1000;i++))
do
{
# 该命令是用来测试的命令,此处为实际执行的命令
sleep 5s
echo "$i"
} &
# 用{}把循环体括起来,后加一个&符号,代表每次循环都把命令放入后台运行,一旦放入后台,就意味着{}里面的命令交给操作系统的一个线程处理了,循环了1000次,就有1000个&把任务放入后台,操作系统会并发1000个线程来处理
done

# 等待1000个后台任务全都执行完成之后,再继续执行执行脚本
wait 

end_time=$(date +%s) 
echo "TIME:$(expr $end_time- $start_time)"

 

Logo

更多推荐