Bash ждет нескольких одновременных подпроцессов и убивает всех по ошибке

Я запускаю сценарий 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

1 ответ

Хм, это выглядит довольно продвинутым;). Правильно ли я предполагаю, что вы никогда не увидите вывод "Create app1 ISO result", потому что скрипт python не завершается? Это может быть связано с неправильной отправкой сигнала на фоновые задания Bash. Это также может быть связано с тем, что ваш код Python неправильно реагирует на сигнал. Вы проверили https://docs.python.org/2/library/signal.html? Конечно, вам нужно выяснить точные шаги, как прервать ваш код Python во время выполнения. Я бы предложил сначала убедиться, что код Python реагирует на сигналы так, как вы хотите.

Другие вопросы по тегам