У меня есть следующие два скрипта, которые имитируют некоторую работу:
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
in mpiproc не завершается, потому что start.sh уже выполнил свои handleSignal
и вызывает exit 0
. Как мне заставить вызовы handleSignal перемещаться вверх по дереву процессов? То есть сначала mpiproc.sh должен обработать сигнал (start.sh каким-то образом ждет этого?), а затем start.sh выполняет очистку и затем завершает работу?
Спасибо!