いくつかのタスクをシミュレートするために、次の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
SIGUSR2シグナルをstart.shに送信します(私の考えではそう思いました)。問題は、handleSignal
start.shがすでに実行してhandleSignal
呼び出しているため、mpiprocの操作が完了していないことですexit 0
。 HandleSignal呼び出しをプロセスツリーの上にどのように移動しますか?これは、まずmpiproc.shがシグナルを処理する必要があることを意味します(start.shはどういうわけかそのシグナルを待ちますか?)。その後、start.shがクリーンアップされてから終了しますか?
ありがとうございます!