1

Linux wait命令教程与详解

 1 year ago
source link: https://www.myfreax.com/bash-wait/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Linux wait命令教程与详解

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

Updated At 16 Dec 2022 4 min read
By myfreax
Linux wait命令教程与详解

bash wait命令

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK