我正在运行带有多个同步命令(python脚本)的bash脚本。 我试图杀死所有进程,如果其中一个失败了。 问题是python脚本仍然在后台运行,如果其中一个失败了,我的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
答案 0 :(得分:0)
嗯,这看起来很先进;)。我是否正确地假设您从未看到"创建app1 ISO结果"然后输出因为python脚本没有终止?这可能是信号没有被正确分派给bash后台作业的问题。它也可能与你的python代码没有正确地对信号做出反应有关。你看过https://docs.python.org/2/library/signal.html了吗?当然,您必须弄清楚在执行时如何中断python代码的确切步骤。我建议首先确保python代码以你想要的方式发出信号。