El guión Bash capta la señal pero espera después a que los procesos terminen

votos
1

actualmente estoy escribiendo un guión de fiesta como este:

foo(){
  while true
  do
    sleep 10
  done
}

bar(){
  while true
  do
    sleep 20
  done
}

foo &
bar &

wait

(Sé que no tiene sentido un guión así, sólo se trata de la estructura)

Ahora quiero añadir el manejo de la señal con trap -- <doSomething> RTMIN+1. Esto funciona al principio. Cuando el script recibe la señal rtmin 1 hace algo pero después existe (con el código de salida 163, que es el número de la señal que se envía).

Este no es el comportamiento que quiero. Quiero que después de recibir la señal, el script siga esperando a que los procesos (en este caso las dos funciones) terminen (lo que por supuesto no ocurrirá en este caso, pero el script debe esperar).

Lo intenté añadiendo una ; waita las cosas que se deben hacer al recibir la señal, pero esto no ayuda (o estoy haciendo algo mal).

¿Alguien sabe cómo lograr el comportamiento deseado?

Gracias de antemano y con los mejores deseos.

Tal vez un ejemplo más preciso ayude:

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

Ahora la RTMIN+2señal debería volver a ejecutar la volumefunción, pero el clockproceso no debería ser interrumpido. (Hasta ahora, todo el guión (con todos los subprocesos) se termina al recibir la señal)

Publicado el 30/04/2020 a las 00:12
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
0

Algo reescrito

Para evitar algunos tenedores inútiles.

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
Respondida el 09/06/2020 a las 11:13
fuente por usuario

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