2つのバックグラウンドサーバープロセス(終了は問題が発生したことを意味します)をフォークするbashスクリプトを作成しようとしましたが、スクリプトは終了します。そのうちの1つが終了すると(他を待つ必要はありません)。
これが私が今まで試したことです:
1回試してください
bashwait
コマンドを使用します。両方のプロセスが完了するのを待っているため、機能しません。私の場合、2つのサーバープロセスが実行されているため、プロセスが完了すると問題が発生したことを意味しているため、このスクリプトを完全に終了する必要があります。
#!/usr/bin/env bash
set -e
./server1 &
pid1="$!"
./server2 &
pid1="$!"
wait "$1"
wait "$2"
2回試してください
上記と同じですが、wait
pidを指定しないでください。同じ行動をしなさい。
...
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 wait
:bash
このオプションが指定された場合は、次
-n
のジョブが終了するのを待ってから終了ステータスを返します。
使用時にwait -n
待つ次ジョブが終了しました。つまり、2 つのバックグラウンド操作のいずれかが終了すると、呼び出しがwait -n
返されます。ジョブの終了状態はの終了状態として表示されますが、wait -n
どのジョブが終了したかは不明です。
-n
wait
オプションが追加されましたbash-4.3-alpha
。