wait 等待后台进程
wait 让脚本等待后台进程结束后再继续:wait $! 等最近一个后台任务,wait PID 等指定进程,不带参数则等当前 shell 的全部子进程。返回码就是被等进程的退出码,所以它同时承担同步与取结果两个职责,是并行编排的粘合剂 —— 先并发启动多个任务,再一次 wait 回收。
基本信息
| 适用平台 | shell 内建(bash/sh/ksh 均支持,POSIX 标准) |
|---|---|
| 语法 | wait [PID | %作业号] |
| 无参数行为 | 等待当前 shell 的所有子进程 |
| 返回值 | 被等待进程的退出码 |
| 相关命令 | jobs、&、kill、timeout |
| 局限 | 只能等自己的子进程 |
典型使用场景
- 并行跑多个任务后统一收口(批处理、并发下载)
- 等后台进程完成再做后续处理(压缩完成后上传)
- 脚本里等待监控或超时进程
- 配合 trap 在退出前做清理
- 避免主流程提前退出导致后台任务被中断
常用示例
常用示例
sleep 5 & pid=$! # 记录后台进程 PID
wait $pid && echo done # 等它结束并根据退出码判断
for i in 1 2 3; do ./job$i.sh & pids[$i]=$!; done # 并发启动并逐个记录 PID
for i in 1 2 3; do wait ${pids[$i]} || echo "job$i 失败"; done
wait # 等当前 shell 的所有子进程
echo all finished
wait $pid || true # set -e 脚本里防止非零退出直接终止
wait -n 2>/dev/null || wait # bash 4.3+ 可等任意一个先结束写法与语义
| 写法 | 等什么 | 适用场景 |
|---|---|---|
| wait $! | 最近一个后台进程 | 单任务串行化 |
| wait PID | 指定 PID 的进程 | 多任务时逐个记录 PID 后回收 |
| wait | 当前 shell 的全部子进程 | 并发一批任务后统一收口 |
| wait %1 | 按作业号 | 交互式脚本里更直观 |
| wait -n | 任意一个先结束(bash 4.3+) | 需要流水线式处理时 |
| 返回值 | 被等进程的退出码 | 用来判断子任务成败 |
在 set -e 的脚本里直接写 wait 有风险:被等进程返回非零会让脚本当场退出。要么显式接住(wait $pid || true),要么紧跟其后处理返回码。
wait 只能等当前 shell 的子进程:其他会话或由服务拉起的进程等不了,需要跨进程等待时改用轮询、PID 文件或进程管理器。
并发编排的实用写法是先把 PID 收进数组再做一轮回收:这样每个任务的退出码都能单独判断,失败的可以重跑或告警,比一把 wait 更有可观测性。