v současné době píšu bash skript, jako je tento:
foo(){
while true
do
sleep 10
done
}
bar(){
while true
do
sleep 20
done
}
foo &
bar &
wait
(Vím, že takový skript nemá smysl, je to jen o struktuře)
Nyní chci přidat zpracování signálu trap -- <doSomething> RTMIN+1
. Nejprve to funguje. Když skript přijme signál rtmin 1, udělá doSomething, ale poté existuje (s výstupním kódem 163, což je číslo vysílaného signálu).
Toto není chování, které chci. Chci, aby po přijetí signálu skript nadále čekal na ukončení procesů (v tomto případě dvou funkcí) (což se samozřejmě v tomto případě nestane, ale skript by měl počkat).
Zkusil jsem to s přidáním a ; wait
k věcem, které by se měly dělat při příjmu signálu, ale to nepomůže (nebo dělám něco špatně).
Ví někdo, jak dosáhnout požadovaného chování?
Díky předem as přáním všeho nejlepšího.
EDIT: Možná přesnější příklad pomůže:
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
Teď RTMIN+2
signál by měl znovu spustit volume
funkce, ale clock
proces by neměl být přerušen. (Doposud je celý skript (se všemi podprocesy) ukončen po přijetí signálu)