linux - Bash 等待多个同时的子进程并在出错时杀死所有子进程

标签 linux bash signals wait sigterm

我正在运行一个包含多个同步命令的 bash 脚本(python 脚本)。 如果其中一个进程失败,我将尝试终止所有进程。 问题是 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

最佳答案

嗯,这看起来很高级;)。我是否正确地假设你永远不会看到“Create app1 ISO result”输出,因为 python 脚本没有终止?这可能是信号未正确发送到 bash 后台作业的问题。它也可能与您的 python 代码没有正确响应信号有关。你查过了吗https://docs.python.org/2/library/signal.html ?当然,您必须弄清楚如何在执行时中断 python 代码的确切步骤。我建议首先确保 python 代码以您想要的方式对信号使用react。

关于linux - Bash 等待多个同时的子进程并在出错时杀死所有子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38420495/

相关文章:

c - 信号处理程序是在内核空间还是用户空间运行?

linux - 在 bash 中对 find 命令的多个结果进行操作

python - `os.symlink` 与 `ln -s`

linux - 删除文件中每个换行符之间的换行符

c# - 在linux上使用mono运行VS编译的C#(串行连接)文件

linux - Bash - 将所有变量设为本地变量是个好主意吗?

java - 在 Java 虚拟机中处理信号

c - 关于 signal() 函数的奇怪 'SIGSEGV' 性能

linux - 文件名差异为 1 的文件的输出行数

linux - awk 无法写入文件