使用 bash “wait”在后台进程之一终止后立即退出

使用 bash “wait”在后台进程之一终止后立即退出

我正在尝试编写一个 bash 脚本来分叉两个后台服务器进程(其终止意味着出现问题),并且该脚本将退出一旦其中一个终止(无需等待另一个)。

到目前为止,这是我尝试过的:

尝试1

使用 bashwait指令。这不起作用,因为它仍然等待两个进程完成。就我而言,我正在运行两个服务器进程,因此如果它们完成,则意味着出现问题,因此我应该完全退出此脚本。

#!/usr/bin/env bash
set -e

./server1 &
pid1="$!"
./server2 & 
pid1="$!"

wait "$1"
wait "$2"

尝试2

与上面相同,但只是wait说不指定 pid。做同样的行为。

...
pid2="$!"
wait

尝试3

我尝试使用子外壳并从那里退出。但这只exit适用于子 shell,所以我们仍然等待两个后台进程完成:

#!/usr/bin/env bash
set -e

( ./server1 || echo crash1; exit 1 ) &
( ./server2 || echo crash2; exit 2 ) &
wait

有没有办法在 bash 中实现这一目标(在后台分叉两个服务器进程,并在其中一个完成后立即退出)?

答案1

wait -n

来自:help waitbash

如果-n提供了该选项,则等待下一个作业终止并返回其退出状态。

使用时wait -n将等待下一个作业终止。这意味着如果两个后台作业中的任何一个终止,对的调用wait -n将返回。您将获得该作业的退出状态作为 的退出状态wait -n,但您不知道哪一个作业终止了。

-n的选项已wait添加到 中bash-4.3-alpha

相关内容