Bash script vang signaal, maar wacht daarna tot de processen worden beëindigd

stemmen
37

op dit moment schrijf ik zo'n bash-script:

foo(){
  while true
  do
    sleep 10
  done
}

bar(){
  while true
  do
    sleep 20
  done
}

foo &
bar &

wait

(Ik weet dat zo'n script geen zin heeft, het gaat alleen om de structuur)

Nu wil ik signaalverwerking toevoegen met trap -- <doSomething> RTMIN+1. Dit werkt in het begin. Als het script het rtmin 1 signaal ontvangt doet het wel iets, maar daarna bestaat het (met de 163 exit code, dat is het nummer van het signaal dat wordt verstuurd).

Dit is niet het gedrag dat ik wil. Ik wil dat het script na ontvangst van het signaal blijft wachten tot de processen (in dit geval de twee functies) worden beëindigd (wat in dit geval natuurlijk niet zal gebeuren, maar het script moet wachten).

Ik heb het geprobeerd met het toevoegen van een ; waitaan de dingen die moeten worden gedaan bij het ontvangen van het signaal, maar dit helpt niet (of ik doe iets verkeerd).

Weet iemand hoe hij het gewenste gedrag kan bereiken?

Alvast bedankt en met de beste wensen.

EDIT: Misschien helpt een nauwkeuriger voorbeeld:

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

Nu moet het RTMIN+2signaal de volumefunctie opnieuw uitvoeren, maar het clockproces mag niet worden onderbroken. (Tot nu toe wordt het hele script (met alle subprocessen) beëindigd bij ontvangst van het signaal)

De vraag is gesteld op 30/04/2020 om 00:12
bron van user
In andere talen...                            


1 antwoorden

stemmen
0

Iets herschreven

Om een aantal nutteloze vorken te vermijden.

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
antwoordde op 09/06/2020 om 11:13
bron van user

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