일부 작업을 시뮬레이션하기 위해 다음 두 스크립트가 있습니다.
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가 정리된 다음 종료됩니까?
감사해요!