일부 작업을 시뮬레이션하는 다음 두 스크립트가 있습니다.
start.sh
단순히 script 로 2개의 (mpi) 프로세스를 시작합니다 mpiproc.sh
.
start.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가 이미 and 호출을 handleSignal
실행했기 때문에 mpiproc의 내 작업이 완료되지 않는다는 것입니다 . HandleSignal 호출이 프로세스 트리 위로 이동하도록 하려면 어떻게 해야 합니까? 먼저 mpiproc.sh가 신호를 처리해야 하고(start.sh가 어떻게든 이를 기다려야 합니까?) start.sh가 정리를 수행한 다음 종료된다는 의미입니까?handleSignal
exit 0
감사해요!