2つのサーバーを起動する単純なbashスクリプトがあります。
#!/bin/bash
(cd ./frontend && gulp serve) & (cd ./backend && gulp serve --verbose)
2 番目のコマンドが終了すると、最初のコマンドが実行され続けるように見えます。
どちらのコマンドが終了したら、他のコマンドも終了するようにこれをどのように変更できますか?
バックグラウンドプロセスのエラーレベルを確認する必要はなく、終了したかどうかを確認するだけです。
ベストアンサー1
これにより、2つのプロセスが開始され、最初のプロセスが完了するのを待ってから、別のプロセスが終了します。
#!/bin/bash
{ cd ./frontend && gulp serve; } &
{ cd ./backend && gulp serve --verbose; } &
wait -n
pkill -P $$
どのように動作しますか?
スタート:
{ cd ./frontend && gulp serve; } & { cd ./backend && gulp serve --verbose; } &
上記の2つのコマンドは、バックグラウンドで2つのプロセスを開始します。
待つ
wait -n
バックグラウンドジョブが終了するのを待ちます。
このオプションにより、
-n
bash 4.3以降が必要です。殺す
pkill -P $$
これにより、現在のプロセスが親プロセスであるすべてのジョブが終了します。つまり、まだ実行中のバックグラウンドプロセスはすべて終了します。
システムにない場合は、
pkill
この行を次のように置き換えてください。kill 0
テストしやすい例
スクリプトを変更すると、gulp
インストールなしでテストできます。
$ cat script.sh
#!/bin/bash
{ sleep $1; echo one; } &
{ sleep $2; echo two; } &
wait -n
pkill -P $$
echo done
上記のスクリプトが実行さbash script.sh 1 3
れ、最初のプロセスが最初に終了します。または、これを実行すると、bash script.sh 3 1
2番目のプロセスが最初に終了します。どちらの場合も、期待どおりに機能することがわかります。