Eu tenho os dois scripts a seguir que simulam algum trabalho:
start.sh
simplesmente lança 2 (mpi) processos com script 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
O cluster que estou executando o script start.sh
envia um sinal SIGUSR2 para start.sh (é o que eu acho). O problema é que meu handleSignal
em mpiproc não é concluído porque start.sh já executou seu handleSignal
e calles exit 0
.
Como posso fazer com que as chamadas handleSignal percorram a árvore de processos? Significado first mpiproc.sh precisa lidar com o sinal (start.sh de alguma forma aguarda isso?) E, em seguida, start.sh faz a limpeza e, em seguida, sai?
Obrigado!