簡體   English   中英

Bash等待多個並發子進程並殺死所有錯誤

[英]Bash wait for several simultaneous subprocesses and kill all on error

我正在運行具有多個同時命令(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

嗯,這看起來相當先進;)。 我是否正確假設您因為python腳本未終止而再也看不到“創建app1 ISO結果”輸出? 信號未正確分配給bash后台作業可能是一個問題。 這也可能與您的python代碼對信號沒有正確反應有關。 您是否簽出了https://docs.python.org/2/library/signal.html 當然,您必須找出執行步驟時如何中斷python代碼的確切步驟。 我建議首先確保python代碼以您想要的方式對信號做出反應。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM