サブシェルでジョブを終了するには、set -mを使用します。

サブシェルでジョブを終了するには、set -mを使用します。

次のbashスクリプトがあります。

#!/bin/bash
set -m
(
    (bin/pnvd &> /dev/null; kill 0) &
    sleep 2
    perl integration-test/fuzz-test.pl || kill 0
    kill %1
)

サブシェルの最初の3つのコマンドは成功し、終了ステータス0を返します。bin/pnvd外部から終了するまで終了しないでください。

ただし、サブシェルで4番目のコマンドを実行した後、スクリプトは次の出力で終了します。

ツール/統合テスト: 行8:4712で終了((bin/pnvd &> /dev/null; kill 0) & sleep 2; perl Integration-tests/fuzz-test.pl || kill 0; kill %1)

ステータスコード 143.

最初の操作だけでなく、プロセスグループ全体を終了するように見えますが、kill %1削除するとset -mステータス0で終了します。

あまり興味がないどのようにこの問題を解決してください。なぜサブシェルが最初のジョブを終了すると、状態143で終了しますか?

ベストアンサー1

から引用https://stackoverflow.com/a/7294947/402322

また、信号によってプログラムが終了すると、bash は終了状態を次のようにエンコードします。

128 + signal-number

したがって、SIGHUPは129を生成し、SIGILLは132を生成し、SIGTERMは143を生成する式です。

上記は、プロセスがSIGTERMを受信したことを意味します。

コードには3つありますkillkill %1他の2つのうちの1つを除外できる場合は、kill 0TERM信号が送信されます。

おすすめ記事