バックグラウンドプロセスの1つが終了した直後に終了するには、bash "wait"を使用します。

バックグラウンドプロセスの1つが終了した直後に終了するには、bash

2つのバックグラウンドサーバープロセス(終了は問題が発生したことを意味します)をフォークするbashスクリプトを作成しようとしましたが、スクリプトは終了します。そのうちの1つが終了すると(他を待つ必要はありません)。

これが私が今まで試したことです:

1回試してください

bashwaitコマンドを使用します。両方のプロセスが完了するのを待っているため、機能しません。私の場合、2つのサーバープロセスが実行されているため、プロセスが完了すると問題が発生したことを意味しているため、このスクリプトを完全に終了する必要があります。

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

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

wait "$1"
wait "$2"

2回試してください

上記と同じですが、waitpidを指定しないでください。同じ行動をしなさい。

...
pid2="$!"
wait

3回試してください

私はサブシェルを使用してそこから終了しようとしました。ただし、これはexitサブシェルでのみ機能するため、2つのバックグラウンドプロセスが完了するのを待ちます。

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

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

Bashでこれを達成する方法はありますか(バックグラウンドで2つのサーバープロセスをフォークし、そのうちの1つが完了するとすぐに終了します)。

ベストアンサー1

wait -n

からhelp waitbash

このオプションが指定された場合は、次-nのジョブが終了するのを待ってから終了ステータスを返します。

使用時にwait -n待つジョブが終了しました。つまり、2 つのバックグラウンド操作のいずれかが終了すると、呼び出しがwait -n返されます。ジョブの終了状態はの終了状態として表示されますが、wait -nどのジョブが終了したかは不明です。

-nwaitオプションが追加されましたbash-4.3-alpha

おすすめ記事