サブプロセスとトラップの強制終了

サブプロセスとトラップの強制終了

いくつかの作業をシミュレートする次の 2 つのスクリプトがあります。

start.shスクリプトを使用して 2 つの (mpi) プロセスを起動するだけですmpiproc.sh

スタート

#!/bin/bash

function trap_with_arg() {
    func="$1" ; shift
    for sig ; do
        trap "$func $sig" "$sig"
    done
}

function handleSignal() {
    echo "Received signal (sleep for 10 sec)"
    for i in {1..2}
    do
      echo "start.sh: sleeping $i"
      sleep 1s
    done
    exit 0
}

# Setup the Trap
trap_with_arg handleSignal SIGINT SIGTERM SIGUSR1 SIGUSR2

mpirun -n 2 mpiproc.sh

mpiproc.sh

function trap_with_arg() {
    func="$1" ; shift
    for sig ; do
        trap "$func $sig" "$sig"
    done
}


function handleSignal() {
    echo "Rank: ${OMPI_COMM_WORLD_RANK} : Received signal (sleep for 10 sec)"
    for i in {1..10}
    do
      echo "Rank: ${OMPI_COMM_WORLD_RANK} sleeping $i"
      sleep 1s
    done
    exit 0
}

# Setup the Trap
trap_with_arg handleSignal SIGINT SIGTERM SIGUSR1 SIGUSR2

echo "MPI Proc  Rank: ${OMPI_COMM_WORLD_RANK} start."
sleep 30s

スクリプトを実行しているクラスターは、start.shstart.sh に SIGUSR2 シグナルを送信します (そうだと思います)。問題は、 start.sh がすでにその呼び出しhandleSignalを実行しているため、mpiproc が終了しないことです。handleSignal 呼び出しをプロセス ツリーまで移動させるにはどうすればよいですか? つまり、最初に mpiproc.sh がシグナルを処理する必要があり (start.sh はどういうわけかそれを待機しているのでしょうか?)、次に start.sh がクリーンアップを実行して終了するということですか?handleSignalexit 0

ありがとう!

関連情報