Signal de capture de script en cascade mais attente de la fin du processus

voix
37

je suis en train d'écrire un script de bash comme celui-ci :

foo(){
  while true
  do
    sleep 10
  done
}

bar(){
  while true
  do
    sleep 20
  done
}

foo &
bar &

wait

(Je sais qu'un tel scénario ne sert à rien, il s'agit juste de la structure)

Maintenant, je veux ajouter le traitement du signal avec trap -- <doSomething> RTMIN+1. Cela fonctionne dans un premier temps. Lorsque le script reçoit le signal rtmin 1, il fait quelque chose mais ensuite il existe (avec le code de sortie 163, qui est le numéro du signal envoyé).

Ce n'est pas le comportement que je veux. Je veux qu'après avoir reçu le signal, le script continue à attendre que les processus (dans ce cas les deux fonctions) se terminent (ce qui bien sûr ne se produira pas dans ce cas, mais le script devrait attendre).

J'ai essayé d'ajouter un ; waita aux choses à faire lors de la réception du signal, mais cela n'aide pas (ou alors je fais quelque chose de mal).

Quelqu'un sait-il comment obtenir le comportement souhaité ?

Merci d'avance et meilleurs vœux.

EDIT : Un exemple plus précis peut aider :

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

Le RTMIN+2signal doit maintenant relancer la volumefonction, mais le clockprocessus ne doit pas être interrompu. (Jusqu'à présent, le script entier (avec tous les sous-processus) est terminé à la réception du signal)

Créé 30/04/2020 à 00:12
utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

Quelque chose de réécrit

Afin d'éviter certaines fourches inutiles.

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
Créé 09/06/2020 à 11:13
source utilisateur

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