- 文档
- 教程
【免费下载链接】linux-command
Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux
wait是 bash 内置的作业控制命令,用于阻塞当前 shell,直到指定的后台进程或作业执行完毕后才返回。本文以 command/wait.md 为核心,系统讲解wait的语法、参数、典型用法,并结合 command/jobs.md、command/bg.md、command/fg.md、command/disown.md 等作业控制命令,给出 shell 脚本中可复制、可运行的实战示例。读完本文,你将掌握如何用wait精确控制后台任务的完成时机,编写可靠的多进程并行脚本。
wait 命令是什么
wait是一个 bash 内建命令(builtin),它的作用是等待指定进程或作业执行完毕,直到其结束运行后才继续执行后续命令。这在 shell 脚本编程中非常常见:当脚本先后台启动了多个任务,又需要在所有(或某个)任务完成后才能进行下一步处理时,wait就是最直接的工具。
与sleep(按指定时长暂停,见 command/sleep.md)不同,wait不是"等多久",而是"等什么"——它不依赖固定的时间,而是以目标进程/作业的实际完成时刻为边界。只要目标没有结束,调用wait的 shell 就会一直阻塞。
一个关键规则(原文档明确强调):使用wait等待作业时,作业标识号前必须添加百分号%,例如wait %1;而等待进程时则直接写进程号(PID),例如wait 27156。
语法与参数
原文档给出的语法为:
wait(参数)其参数是进程或作业标示:既可以指定进程号(PID),也可以指定作业号(jobspec)。
从 bash 的完整形式看,wait还可接收多个参数,并支持可选选项:
wait [-fn] [jobspec ... | pid ...]jobspec:作业标识符,等待对应作业完成。等待作业时必须在作业号前加%,如wait %1。pid:进程号,等待该进程完成,如wait 27156。- 若不提供任何参数,则等待当前 shell 的所有后台任务全部完成(这也是脚本中最常用的形式)。
-f与-n等选项用于调整等待行为,不同 bash 版本细节略有差异,可通过help wait查看当前环境的完整说明。
wait的返回值是被等待进程/作业的退出状态(exit status);如果目标进程是被信号终止的,则返回128 + 信号编号;若发生错误(如指定的作业或进程不存在),则返回失败状态。
实战:等待指定作业完成(%作业号)
原文档给出的第一个实例是等待作业号为 1 的作业完成。首先在后台运行一个sleep进程:
sleep 10s & [1] 27156命令执行后输出[1] 27156,其中[1]是作业号(job number),27156是后台进程的PID。随后使用wait指定作业号等待它完成:
wait %1 #等待作业号为1的作业完成 [1]+ Done sleep 10s注意wait %1中作业号前加了%,这是等待作业与等待进程在写法上的核心区别。sleep 10s结束后,shell 输出[1]+ Done sleep 10s的完成通知,wait随即返回。
实战:等待指定进程完成(PID)
除了作业号,wait也接受进程号。原文档给出的第二种用法:
wait 27156 [1]+ Done sleep 10s这里直接传入后台任务的 PID27156,效果与wait %1等价——两者指向同一个后台任务,只是标识方式不同。
在脚本中更常见的写法是使用$!自动获取最近一个后台进程的 PID,无需手动记录:
#!/bin/bash ./long_task.sh & pid=$! # $! 保存刚启动的后台进程 PID wait "$pid" # 等待该任务完成 echo "任务已结束"实战:等待所有后台任务完成
不指定任何参数时,wait会等待当前 shell 启动的所有后台任务全部结束。这在"并行启动多个任务、统一收尾"的场景中非常实用:
#!/bin/bash # 同时启动三个后台任务 sleep 5 & sleep 3 & sleep 8 & # 阻塞,直到上面三个任务全部完成 wait echo "全部后台任务执行完毕"脚本会在此处停留约 8 秒(取决于最后一个任务),随后输出"全部后台任务执行完毕"。这正是原文档所说"待指定的指令执行完成后,才会继续执行后面的任务"的典型体现。
等待的返回值与信号语义
wait返回被等待目标的退出状态,因此它还可以作为脚本分支判断的依据。例如:
#!/bin/bash curl -s https://example.com/data.json > data.json & wait $! && echo "下载成功" || echo "下载失败,退出码 $?"当后台任务因收到信号而终止时,wait返回128 + 信号编号。这与 command/kill.md 中介绍的信号机制一致:例如任务被SIGKILL(信号 9)杀死,wait返回 137。利用这一特性,可以识别后台任务是被正常退出还是被信号中断。
与作业控制命令的配合使用
wait并非孤立存在,它属于 bash 的作业控制命令家族。bash 的作业控制命令包括bg、fg、kill、wait、disown、suspend(这一结论在 command/jobs.md、command/bg.md、command/fg.md 等文档中反复出现),它们共同构成了对前后台任务的管理闭环:
| 命令 | 作用 | 仓库文档 |
|---|---|---|
jobs | 显示当前 shell 的作业状态,-l可同时列出 PID,-r/-s筛选运行/停止状态 | command/jobs.md |
bg | 将暂停(Stopped)的作业放到后台继续运行,等价于命令末尾加& | command/bg.md |
fg | 将后台作业调回前台终端运行 | command/fg.md |
wait | 阻塞等待指定作业/进程完成 | command/wait.md |
disown | 从当前 shell 的作业表中移除作业,避免 shell 退出时连带结束任务 | command/disown.md |
suspend | 挂起当前 shell 的执行,直到收到SIGCONT信号 | command/suspend.md |
kill | 向作业或进程发送信号(如STOP、CONT、KILL) | command/kill.md |
完整的协作流程通常是:
- 用
sleep 60 &启动后台任务,或用Ctrl+Z将前台任务暂停; - 用
jobs -l查看作业号与对应 PID(输出格式参见 command/jobs.md); - 用
bg %1/fg %1调整前后台状态; - 用
wait %1或wait <PID>等待其结束; - 如需让任务脱离 shell 生命周期管理,可用
disown。
例如,先暂停一个前台任务再恢复并等待:
sleep 60 ^Z [1]+ Stopped sleep 60 bg %1 # 让作业1在后台继续运行 [1]+ sleep 60 & wait %1 # 等待作业1完成注意:wait只能等待当前 shell 的作业/子进程。经过disown移出作业表、或被其他进程收养的任务,不再受当前 shell 的wait管辖,这也是 command/disown.md 示例中"移除作业后任务仍继续运行"的原因所在。
在 shell 脚本中的典型应用
场景一:并行任务统一收尾(如多文件并行下载、并行编译)。
#!/bin/bash for url in $(cat urls.txt); do wget -q "$url" & done wait # 等待所有下载完成 echo "全部下载完成"场景二:以退出码驱动后续逻辑。
#!/bin/bash run_backup & backup_pid=$! wait "$backup_pid" if [ $? -eq 0 ]; then echo "备份成功,继续后续操作" else echo "备份失败,终止流程" exit 1 fi场景三:用sleep演示延时任务与wait的组合(sleep支持2s/2m/2h/2d/infinity等时间后缀,详见 command/sleep.md):
#!/bin/bash sleep 2 & wait $! echo "2 秒延时结束"使用前提与注意事项
- 作业号前必须加
%:等待作业写wait %1,等待进程写wait 27156,两者不能混淆。这是原文档特别强调的规则。 - 需要开启作业控制:bash 的作业控制命令依赖
set选项monitor处于开启状态。可用set -o查看monitor行确认,用set -o monitor或set -m开启(command/jobs.md 的注意事项中给出了相同说明)。 wait是内建命令:帮助信息可通过help wait查看;它属于 bash 内建命令体系,而不是独立的外部程序。- 退出状态语义:
wait返回被等待目标的退出状态;目标被信号终止时返回128 + 信号编号。 - 只能等待自己的子进程:
wait无法等待非当前 shell 启动的进程,这与作业表的管理范围一致。
在 linux-command 项目中查阅与扩展
本文内容以仓库中的 command/wait.md 为骨架整理。该仓库在 command 目录下收录了 600 多个 Linux 命令的 Markdown 手册文档(详见 README.md),并且:
- 可通过
npm install linux-command安装 npm 包,以编程方式读取任意命令的 Markdown 文本(如require("linux-command/command/wait.md"))与命令索引数据; - 可通过仓库的 Web 版本在线搜索
wait、jobs、bg等命令,网页内容由这些 Markdown 文档构建生成; - 每个命令文档都采用统一的"概要—主要用途—选项—参数—例子—注意"结构,便于对照查阅。
与wait关系最紧密的扩展阅读文档均在本仓库command目录下:command/jobs.md(查看作业状态)、command/bg.md(后台恢复)、command/fg.md(前台切换)、command/disown.md(移除作业)、command/suspend.md(挂起 shell)、command/kill.md(信号控制)。掌握这一组命令,就能在脚本与交互式终端中自如驾驭 Linux 的前后台任务与进程生命周期。
- 文档
- 教程
【免费下载链接】linux-command
Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux
相关推荐
fish-shell 内置命令 wait 完全指南:等待后台任务完成的正确姿势
fish shell 内置命令 wait 完全指南:等待后台任务完成的正确姿势 导读 : wait 是 fish shell 内置的作业控制命令,用于等待一个或
CLI开发工具linux-command 项目详解:bash 内建命令 fc —— 历史命令的查看、编辑与替换执行
linux command 项目详解:bash 内建命令 fc —— 历史命令的查看、编辑与替换执行 导读 fc (fix command)是 bash 提供的
文档教程linux-command 手册精读:Bash 内建 suspend 命令详解——挂起与恢复 Shell 执行
linux command 手册精读:Bash 内建 suspend 命令详解——挂起与恢复 Shell 执行 本篇技术指南以 linux command 仓库
文档教程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考