web-dev-qa-db-ja.com

セット-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番目のコマンドを実行すると、スクリプトは次の出力で終了します。

 tools/Integration-test:8行目:4712終了((bin/pnvd&>/dev/null; kill 0)&sleep 2; Perl Integration-test/fuzz-test.pl || kill 0; %1を殺す)

およびステータスコード143。

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

私はこれを修正するためにhowにはあまり興味がありませんが、もっと興味があります:why最初のジョブを強制終了すると、サブシェルはステータス143で終了しますか?

3
rightfold

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

また、シグナルが原因でプログラムが停止した場合、bashは終了ステータスを次のようにエンコードすることで通知します。

128 + signal-number

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

上記は、プロセスにSIGTERMがあることを意味します。

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

1
ceving