Ich habe die folgenden zwei Skripte, die einige Arbeiten simulieren:
start.sh
startet einfach 2 (MPI-)Prozesse mit Skript 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
Der Cluster, in dem ich das Skript ausführe, start.sh
sendet ein SIGUSR2-Signal an start.sh (das glaube ich zumindest). Das Problem ist, dass mein handleSignal
in mpiproc nicht beendet wird, weil start.sh bereits ausgeführt hat handleSignal
und aufruft exit 0
. Wie kann ich dafür sorgen, dass die handleSignal-Aufrufe den Prozessbaum hinauf wandern? Bedeutet das, dass zuerst mpiproc.sh das Signal verarbeiten muss (start.sh wartet irgendwie darauf?) und dann start.sh die Bereinigung durchführt und dann beendet wird?
Danke!