Bash wait 命令及示例


介绍

Bash shell 是 Unix/Linux 环境中最广泛使用的 shell 之一。其最有用的命令之一是 wait 命令。在本文中,我们将探讨 Bash wait 命令及其用法,并提供示例。

什么是 Bash wait 命令?

wait 命令是 Bash shell 的内置命令,用于等待后台进程终止。这意味着 Bash shell 将暂停执行,直到指定的进程完成。

Bash wait 命令的用法

wait 命令的基本语法如下:

wait [n]

这里,'n' 是我们要等待的后台进程的进程 ID。如果没有指定进程 ID,则 wait 命令将等待所有后台进程完成。

等待单个进程

假设我们有一个脚本,它在后台运行一个长时间运行的命令:

#!/bin/bash
sleep 10 &
echo "Command running in background..."

在这个脚本中,我们使用“&”符号在后台运行“sleep”命令。然后,我们向控制台打印一条消息。如果我们希望在继续执行脚本之前等待“sleep”命令完成,我们可以使用 wait 命令:

#!/bin/bash
sleep 10 &
echo "Command running in background..."
wait
echo "Command has completed!"

在这个更新后的脚本中,我们在后台启动“sleep”命令后添加了“wait”命令。这意味着脚本将等待“sleep”命令完成,然后再向控制台打印最终消息。

等待多个进程

有时,我们可能有多个在后台运行的进程需要等待。在这种情况下,我们可以指定要等待的每个进程的进程 ID:

#!/bin/bash
sleep 5 &
sleep 10 &
sleep 15 &
echo "Commands running in background..."
wait %1 %2 %3
echo "All commands have completed!"

在这个脚本中,我们在后台运行三个“sleep”命令,每个命令的持续时间不同。然后,我们向控制台打印一条消息。要等待所有三个命令完成,我们可以使用“%”符号将它们的进程 ID 作为参数指定给 wait 命令。

处理错误

如果我们尝试等待一个不存在的进程,wait 命令将返回一个错误。我们可以使用“||”运算符来处理此错误:

#!/bin/bash
sleep 10 &
echo "Command running in background..."
wait || echo "Process not found!"
echo "Command has completed!"

在这个脚本中,我们在后台运行“sleep”命令,并使用 wait 命令等待它完成。如果“sleep”命令不存在,则 wait 命令将返回一个错误。我们可以使用“||”运算符来处理此错误,该运算符只有在左侧命令返回非零退出代码时才会执行右侧命令。

将 wait 与管道一起使用

wait 命令也可以与管道一起使用。例如,如果我们有两个命令的管道,我们可以等待第二个命令完成,然后再继续执行脚本:

#!/bin/bash
echo "Starting pipeline..."
echo "hello world" | grep "world" &
wait %1
echo "Pipeline has completed!"

在这个脚本中,我们有一个由两个命令组成的管道:“echo "hello world"”和“grep "world"”。我们使用“&”符号在后台运行管道,然后使用 wait 命令等待第二个命令(“grep”命令)完成。

在循环中使用 wait

我们也可以在循环中使用 wait 命令来等待多个后台进程完成。例如,假设我们有一个脚本,它在循环中启动多个后台进程:

#!/bin/bash
for i in {1..5}
do
   sleep $i &
done
echo "Background processes started..."
wait
echo "All processes have completed!"

在这个脚本中,我们使用循环在后台启动五个“sleep”命令。然后,我们向控制台打印一条消息,并使用 wait 命令等待所有后台进程完成。一旦所有进程都完成,我们就向控制台打印最终消息。

将 wait 与命令替换一起使用

我们还可以将 wait 命令与命令替换一起使用。例如,假设我们有一个脚本,它使用命令替换生成后台进程列表:

#!/bin/bash
processes=$(for i in {1..3}; do sleep $i & echo $!; done)
echo "Background processes started: $processes"
wait $processes
echo "All processes have completed!"

在这个脚本中,我们使用命令替换来生成后台进程 ID 列表。我们使用循环启动后台进程,然后使用“echo $!”命令打印每个进程的进程 ID。然后,我们使用 wait 命令等待所有后台进程完成,使用命令替换生成的进程 ID 列表。一旦所有进程都完成,我们就向控制台打印最终消息。

使用超时与 wait

wait 命令也可以与 timeout 命令一起使用,以限制我们等待进程完成的时间量。例如,假设我们有一个脚本,它在后台启动一个长时间运行的进程,我们希望等待它完成,但我们也希望限制等待时间:

#!/bin/bash
sleep 20 &
echo "Command running in background..."
timeout 10s wait
if [ $? -eq 0 ]; then
echo "Command has completed!"
else
echo "Command timed out!"
fi

在这个脚本中,我们在后台启动一个持续时间为 20 秒的“sleep”命令。然后,我们向控制台打印一条消息,并使用 timeout 命令将我们等待“sleep”命令完成的时间限制为 10 秒。如果“sleep”命令在时间限制内完成,我们将向控制台打印一条消息,指示它已完成。如果命令超时,我们将打印一条消息,指示命令已超时。

将 wait 与 trap 一起使用

我们还可以将 wait 命令与 trap 命令一起使用,以处理信号并在必要时终止后台进程。例如,假设我们有一个脚本,它启动一个后台进程,如果用户按下 Ctrl+C,我们希望终止它:

#!/bin/bash
trap "kill %1" SIGINT
sleep 20 &
echo "Command running in background..."
wait
echo "Command has completed!"

在这个脚本中,我们使用 trap 命令来处理 SIGINT 信号,该信号在用户按下 Ctrl+C 时发送。我们指定“kill %1”命令在接收到信号时终止后台进程。然后,我们在后台启动“sleep”命令,并使用 wait 命令等待它完成。一旦命令完成,我们就向控制台打印一条消息。

结论

Bash wait 命令是一个有用的工具,允许我们等待后台进程完成。我们可以使用它来确保我们的脚本以可预测和有序的方式运行,并在进程未按预期完成时处理错误。通过了解 wait 命令的基础知识及其用法,我们可以提高 Bash 脚本的可靠性和功能。

更新于:2023年4月12日

8K+ 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.