O sinal de captura do script Bash, mas aguarde depois que os processos terminem

votos
4

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+2sinal deve voltar a executar a volumefunção, mas o clockprocesso não deve ser interrompido. (Até agora, todo o script (com todos os subprocessos) é terminado após a recepção do sinal)

Publicado 30/04/2020 em 00:12
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Algo reescrito

A fim de evitar alguns garfos inúteis.

clock(){  local prefix=C interval=2
    while :;do
        printf "%s: %(%d.%m %H:%M:%S)T\n" $prefix -1
        sleep $interval
    done
}

volume(){  local prefix=V vol=()
    while IFS=':[]' read field playback val foo;do
        [ "$playback" ] && [ -z "${playback//*Playback*}" ] && [ "$val" ] &&
            vol+=(${val%\%})
    done < <(amixer get Master)
    suffix='%%'
    if [ "$vol" = "off" ] ;then
        icon="" #alternative: deaf:  mute: 
        suffix=''
    elif (( vol > 50 )) ;then  icon=""
    elif (( vol > 30 )) ;then  icon=""
    else                       icon=""
    fi
    printf -v values "%3s$suffix " ${vol[@]}
    printf "%s%s %s\n" $prefix "$icon" "$values"
}

clock & volume &

trap -- "volume" RTMIN+2
echo -e "To get status, run:\n  kill -RTMIN+2 $$"

while :;do wait ;done
Respondeu 09/06/2020 em 11:13
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more