actualmente estou a escrever um guião como este:
foo(){
while true
do
sleep 10
done
}
bar(){
while true
do
sleep 20
done
}
foo &
bar &
wait
(Eu sei que não há nenhum ponto em tal script, é apenas sobre a estrutura)
Agora quero adicionar o manuseio do sinal com trap -- <doSomething> RTMIN+1
. Isto funciona no início. Quando o script recebe o sinal rtmin 1, ele faz algo, mas depois existe (com o código de saída 163, que é o número do sinal que está sendo enviado).
Este não é o comportamento que eu quero. Quero que depois de receber o sinal, o script continue a esperar que os processos (neste caso as duas funções) terminem (o que obviamente não acontecerá neste caso, mas o script deve esperar).
Eu tentei adicionar um ; wait
às coisas que devem ser feitas ao receber o sinal, mas isto não ajuda (ou estou a fazer algo errado).
Alguém sabe como alcançar o comportamento desejado?
Obrigado antecipadamente e com os melhores cumprimentos.
EDITAR: Talvez um exemplo mais preciso ajude:
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
Agora o RTMIN+2
sinal deve voltar a executar a volume
função, mas o clock
processo não deve ser interrompido. (Até agora, todo o script (com todos os subprocessos) é terminado após a recepção do sinal)