首页/系统/Linux 运维命令速查/wait 等待进程结束
进程与作业69 条

wait 等待进程结束

等待后台进程/作业结束再继续:wait $! 等最近一个、wait PID 等指定、无参等全部;脚本串行编排的粘合剂。

Linux 运维命令速查系统更新于 2026-10-13

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 更有可观测性。

易错点

  • set -e 环境下 wait 返回非零导致脚本退出:显式接住返回值,再按业务决定是否继续
  • 只记 $! 就以为能回收全部任务:$! 只保存最近一个后台 PID,多个任务必须逐个记录
  • 后台任务输出与主流程混在一起:需要区分来源时分别重定向到各自的日志文件
  • 以为 wait 能等任意进程:它只对自己的子进程有效,跨会话等待要换机制

数据来源与参考

  • man 1 bash(SHELL BUILTIN COMMANDS 章节)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌