2016-07-17 7 views
0

複数の同時コマンド(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 

答えて

0

フム、これは非常に高度に見えます;)。 Pythonスクリプトが終了しないため、「app1のISO結果を作成」という出力が表示されないことを正しく想定していますか?シグナルがbashバックグラウンドジョブに正しくディスパッチされないという問題が発生する可能性があります。それはあなたのpythonコードがシグナルに適切に反応しないことに関連するかもしれません。 https://docs.python.org/2/library/signal.htmlをチェックしましたか?もちろん、実行中にPythonコードを中断する方法を正確に理解する必要があります。最初に、Pythonコードがあなたが望むように信号に反応することを確認することをお勧めします。

+0

実際に私はPythonスクリプトから終了コードを取得していますが、実際には1で終了すると、TERMシグナルを親スクリプト(ジョブ)に送信しないか、少なくとも終了しませんまだ実行中の他のPythonスクリプト – user3502786

+0

もしあなたが完全な実行の出力を掲示し、失敗した行を指していれば、これにいくつかの光を当てることができます。これを解決するためには、タイミングを正確に理解することが不可欠です。 –

+0

どのように私の目標(これは単なるラッパースクリプトです)を満たすためにbashスクリプトを実装しますか?Pythonスクリプトから終了コードを取得するので、明らかに問題はありません。間違ったシグナルを捕まえて親子プロセスへの転送 – user3502786

関連する問題