次の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つありますkill
。kill %1
他の2つのうちの1つを除外できる場合は、kill 0
TERM信号が送信されます。