wait命令是一个等待指定进程完成的命令,当进程状态发生变化后,wait命令返回的进程的退出状态

由于wait命令影响当前Shell执行,因此它在大多数shell中是内置命令。在本教程中,我们将探讨Bash内置wait命令。

wait 命令详解

shell内置的wait命令的语法形式是wait [options] IDoptionswait命令的选项,可选参数,ID是进程或任务ID。

如果没有指定ID,wait命令等待所有进程状态改变。并返回的最后一个进程的退出状态。

例如命令wait 7654,等待PID 7654的后台进程直到退出。当指定多个进程时,wait命令等待所有进程状态改变。

wait 7654

wait 命令作业任务

使用jobspec指定作业ID,这是一种引用作业进程的方法。以百分比符号开始,后跟作业编号。

例如命令rsync -a /home /tmp/home &启动进程在后台复制目录的所有内容到临时目录/tmp/home并在终端打印括号括起来的作业ID和进程ID ,例如[3] 54377

要等待rsync命令的作业,可以运行命令wait %3,注意这里指定的不是进程的PID,而是作业ID。

rsync -a /home /tmp/home & #[3] 311013
wait %3
[2] 54377

wait 命令等待后台进程

在使用wait命令的-n选项时,如果指定多个进程的PID或者作业ID给wait命令,wait命令仅返回第一个进程的退出状态。

如果没有提供进程PID或者作业ID,wait -n命令等待所有后台进程完成并返回退出状态。

如果你还想打印进程的PID,请使用wait命令的-p选项。-p选项在BASH 5.1版本引入。如果使用较旧的BASH版本,您将获得invalid option错误。

wait -n 45432 54346 76573

wait -p  -n 45432 54346 76573

wait 命令实例

wait命令通常用于Shell脚本生成并行执行的子进程。为了说明wait命令如何工作,创建test.sh脚本。

#!/bin/bash
sleep 30 &
process_id=$!
echo "PID: $process_id"
wait $process_id
echo "Exit status: $?"
test.sh

!/bin/bash称为shebang,它告诉操作系统使用哪个解释器来解析文件的其余部分。sleep 30 &使用sleep命令模拟一个耗时的后台进程。

process_id=$!声明变量process_id并保存sleep命令的进程PID,$!是Bash内部变量,用于存储上一次运行进程的PID。echo "PID: $process_id"打印sleep命令PID号。

wait $process_id将sleep命令进程的PID传递给wait命令,wait命令将一直等待,直到sleep命令的完成。

echo "Exit status: $?"打印wait命令的退出状态。 $?是Bash内部变量,用于保存最后运行的命令的退出状态。如果您运行脚本,它将打印这样的内容。

PID: 36353
Exit status: 0

waitn.sh使用wait命令的-n选项示例,执行脚本时,它会产生3个后台进程。 wait -n等待第一个作业完成。wait等待所有后台任务完成。

#!/bin/bash
sleep 3 &
sleep 30 &
sleep 5 &
wait -n
echo "First job completed."
wait
echo "All jobs completed."
waitn.sh
first job completed
all jobs completed

最后一个示例说明wait命令的-f选项。使用快捷键CTRL+ALT+T打开终端并运行命令sleep 3600 &创建一个后进程。

然后运行命令wait 46671等待这个进程,最后打开另一个终端并使用kill命令停止进程。

当终止进程46671后,wait命令完成等待并返回进程的退出代码。

sleep 3600 & #[1] 46671

wait 46671

kill -STOP 46671 #在另一个终端

现在,重复相同的步骤,但这一次使用wait -f $pid。停止另一个终端的进程,这次wait命令将无法完成。 它将在sleep进程终止之前运行。

sleep 3600 & # [2] 308313
wait -f 308313

kill -STOP 308313

结论

wait命令等待指定的进程完成并返回进程的退出代码。如果您有任何问题或反馈,请随时留下评论。