wait命令是一个等待指定进程完成的命令,当进程状态发生变化后,wait命令返回的进程的退出状态。
由于wait
命令影响当前Shell执行,因此它在大多数shell中是内置命令。在本教程中,我们将探讨Bash内置wait
命令。
wait 命令详解
shell内置的wait
命令的语法形式是wait [options] ID
。options
wait命令的选项,可选参数,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: $?"
!/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."
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
命令等待指定的进程完成并返回进程的退出代码。如果您有任何问题或反馈,请随时留下评论。