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