Bash-skriptet fanger signal, men vent deretter på at prosesser skal avsluttes

stemmer
37

for tiden skriver jeg et bash script som dette:

foo(){
  while true
  do
    sleep 10
  done
}

bar(){
  while true
  do
    sleep 20
  done
}

foo &
bar &

wait

(Jeg vet at det ikke er noe poeng i et slikt manus, det handler bare om strukturen)

Nå vil jeg legge til signalhåndtering med trap -- <doSomething> RTMIN+1 . Dette fungerer med det første. Når skriptet mottar rtmin 1-signalet, gjør det noe, men etterpå eksisterer det (med 163 exit-koden, som er nummeret på signalet som sendes).

Dette er ikke den oppførselen jeg ønsker. Jeg vil at etter mottak av signalet, fortsetter skriptet å vente på at prosessene (i dette tilfellet de to funksjonene) skal avsluttes (noe som selvfølgelig ikke vil skje i dette tilfellet, men skriptet bør vente).

Jeg prøvde det med å legge til en ; wait til tingene som bør gjøres når jeg mottar signalet, men dette hjelper ikke (eller jeg gjør noe galt).

Vet noen hvordan man oppnår ønsket atferd?

På forhånd takk og med beste ønsker.

EDIT: Kanskje et mer presist eksempel hjelper:

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

RTMIN+2 signalet skal kjøres på nytt volume funksjon, men clock prosessen skal ikke avbrytes. (Til nå avsluttes hele skriptet (med alle delprosesser) når signalet mottas)

Publisert på 30/04/2020 klokken 00:12
bruker
På andre språk...                            


1 svar

stemmer
0

Noe omskrevet

For å unngå noen unyttige gafler.

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
Svarte 09/06/2020 kl. 11:13
kilden bruker

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