derzeit schreibe ich ein Bash-Skript wie dieses:
foo(){
while true
do
sleep 10
done
}
bar(){
while true
do
sleep 20
done
}
foo &
bar &
wait
(Ich weiß, dass ein solches Skript keinen Sinn hat, es geht nur um die Struktur)
Jetzt möchte ich die Signalverarbeitung mit trap -- <doSomething> RTMIN+1
. Dies funktioniert zunächst einmal. Wenn das Skript das Signal rtmin 1 empfängt, tut es etwas, aber danach existiert es (mit dem 163-Exit-Code, der die Nummer des gesendeten Signals ist).
Das ist nicht das Verhalten, das ich will. Ich möchte, dass das Skript nach dem Empfang des Signals weiterhin auf die Beendigung der Prozesse (in diesem Fall der beiden Funktionen) wartet (was in diesem Fall natürlich nicht passieren wird, aber das Skript sollte warten).
Ich habe es mit dem Hinzufügen von a ; wait
zu den Dingen, die beim Empfang des Signals getan werden sollten, versucht, aber das hilft nicht (oder ich mache etwas falsch).
Weiß jemand, wie das gewünschte Verhalten erreicht werden kann?
Danke im Voraus und mit besten Wünschen.
EDIT: Vielleicht hilft ein präziseres Beispiel:
clock(){
local prefix=C
local interval=1
while true
do
printf ${prefix} $(date '+%d.%m %H:%M:%S')\n
sleep $interval
done
}
volume(){
prefix=V
volstat=$(amixer get Master 2>/dev/null)
echo $volstat | grep \[off\] >/dev/null && icon= #alternative: deaf: mute:
vol=$(echo $volstat | grep -o \[[0-9]\+%\] | sed s/[^0-9]*//g;1q)
if [ -z $icon ] ; then
if [ $vol -gt 50 ]; then
icon=
#elif [ $vol -gt 30 ]; then
# icon=
else
icon=
fi
fi
printf ${prefix}%s %3s%%\n $icon $vol
}
clock &
volume &
trap -- volume RTMIN+2
wait
Nun sollte das RTMIN+2
Signal die volume
Funktion erneut ausführen, aber der clock
Prozess sollte nicht unterbrochen werden. (Bis jetzt wird das gesamte Skript (mit allen Unterprozessen) beim Empfang des Signals beendet)