複数の同時コマンド(pythonスクリプト)でbashスクリプトを実行しています。 いずれかのプロセスが失敗した場合、すべてのプロセスを強制終了しようとしています。 問題は、Pythonスクリプトがまだバックグラウンドで実行されていることです。そのうちの1つが失敗した場合、私のbashスクリプトはわかりません。複数の同時サブプロセスを待ち、エラー時にすべてを強制終了します。
はここに私のスクリプトからの抜粋です:
set -a
trap cleanup_children SIGTERM
MY_PID=$$
function thread_listener() {
to_execute="$1"
echo "Executing $to_execute ..."
$to_execute &
PID=$!
trap 'echo killing $PID; kill $PID' SIGTERM
echo "Waiting for $PID ($to_execute) ..."
wait $PID || if `kill -0 $MY_PID &> /dev/null`; then kill $MY_PID; fi
}
function cleanup_children() {
for job in `jobs -p`
do
if `kill -0 $job &> /dev/null`; then
echo "Killing child number $job"
ps -p $job
kill $job
fi
done
}
function create_app1() {
cd ${GIT_DIR}
python ./create-app.py -myapp
exit_code=$?
echo "Create app1 ISO result: ${exit_code}"
[ "${exit_code}" == "1" ] && exit 1
mv ${ISO_OUTPUT_DIR}/rhel-7.1.iso ${ISO_OUTPUT_DIR}/${ISO_NAME}.iso
}
function create_app2() {
cd ${GIT_DIR}
python ./create-app.py -do-something
exit_code=$?
echo "Create app1 ISO result: ${exit_code}"
[ "${exit_code}" == "1" ] && exit 1
mv ${ISO_OUTPUT_DIR}/rhel-7.1.iso ${ISO_OUTPUT_DIR}/${ISO_NAME}.iso
}
export -f create_app1
export -f create_app2
echo "MY_PID=$MY_PID"
thread_listener create_app1 &
PID_APP1=$!
thread_listener create_app2 &
PID_APP2=$!
wait
kill $PID_APP1 2> /dev/null
kill $PID_APP2 2> /dev/null
実際に私はPythonスクリプトから終了コードを取得していますが、実際には1で終了すると、TERMシグナルを親スクリプト(ジョブ)に送信しないか、少なくとも終了しませんまだ実行中の他のPythonスクリプト – user3502786
もしあなたが完全な実行の出力を掲示し、失敗した行を指していれば、これにいくつかの光を当てることができます。これを解決するためには、タイミングを正確に理解することが不可欠です。 –
どのように私の目標(これは単なるラッパースクリプトです)を満たすためにbashスクリプトを実装しますか?Pythonスクリプトから終了コードを取得するので、明らかに問題はありません。間違ったシグナルを捕まえて親子プロセスへの転送 – user3502786