私は次の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で終了しますか?
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信号を送信します。