В настоящее время я пишу такой бэш-скрипт:
foo(){
while true
do
sleep 10
done
}
bar(){
while true
do
sleep 20
done
}
foo &
bar &
wait
(Я знаю, что в таком сценарии нет смысла, речь идет только о структуре)
Теперь я хочу добавить обработку сигналов с помощью trap -- <doSomething> RTMIN+1
. Поначалу это работает. Когда скрипт получает сигнал rtmin 1, он что-то делает, но потом он существует (с кодом выхода 163, который является номером посылаемого сигнала).
Это не то поведение, которого я хочу. Я хочу, чтобы после получения сигнала, скрипт продолжает ждать, пока процессы (в данном случае две функции) завершатся (что, конечно, не произойдет в этом случае, но скрипт должен ждать).
Я попробовал это с добавлением a ; wait
к вещам, которые должны быть сделаны при получении сигнала, но это не помогает (или я делаю что-то не так).
Кто-нибудь знает, как добиться желаемого поведения?
Заранее спасибо и с наилучшими пожеланиями.
EDIT: Может быть, более точный пример помогает:
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
Сейчас RTMIN+2
сигнал должен перезапустить volume
функцию, но clock
процесс не должен быть прерван. (До сих пор весь скрипт (со всеми подпроцессами) завершается при получении сигнала)