我正在尝试编写一个 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 wait
bash
如果
-n
提供了该选项,则等待下一个作业终止并返回其退出状态。
使用时wait -n
将等待下一个作业终止。这意味着如果两个后台作业中的任何一个终止,对的调用wait -n
将返回。您将获得该作业的退出状态作为 的退出状态wait -n
,但您不知道哪一个作业终止了。
-n
的选项已wait
添加到 中bash-4.3-alpha
。