2つのバックグラウンドコマンドが与えられた場合、そのうちの1つが終了すると、残りのコマンドを終了します。

2つのバックグラウンドコマンドが与えられた場合、そのうちの1つが終了すると、残りのコマンドを終了します。

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 $$

どのように動作しますか?

  1. スタート:

    { cd ./frontend && gulp serve; } &
    { cd ./backend && gulp serve --verbose; } &
    

    上記の2つのコマンドは、バックグラウンドで2つのプロセスを開始します。

  2. 待つ

    wait -n
    

    バックグラウンドジョブが終了するのを待ちます。

    このオプションにより、-nbash 4.3以降が必要です。

  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 12番目のプロセスが最初に終了します。どちらの場合も、期待どおりに機能することがわかります。

おすすめ記事