Semnalul de captură al scriptului Bash, dar așteptați apoi terminarea proceselor

voturi
46

în prezent scriu un scenariu bash astfel:

foo(){
  while true
  do
    sleep 10
  done
}

bar(){
  while true
  do
    sleep 20
  done
}

foo &
bar &

wait

(Știu că nu are niciun rost într-un astfel de scenariu, este vorba doar despre structură)

Acum vreau să adaug cu gestionarea semnalului trap -- <doSomething> RTMIN+1 . Acest lucru funcționează la început. Când scriptul primește semnalul rtmin 1, face doSomething, dar apoi există (cu codul de ieșire 163, care este numărul semnalului trimis).

Acesta nu este comportamentul pe care mi-l doresc. Vreau ca după primirea semnalului, scriptul să aștepte în continuare procesele (în acest caz cele două funcții) să se încheie (ceea ce desigur nu se va întâmpla în acest caz, dar scriptul ar trebui să aștepte).

Am încercat-o cu adăugarea unui ; wait la lucrurile care ar trebui făcute la primirea semnalului, dar acest lucru nu ajută (sau fac ceva greșit).

Știe cineva cum să obțină comportamentul dorit?

Mulțumesc anticipat și cu cele mai bune urări.

EDIT: Poate un exemplu mai precis ajută:

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

Acum RTMIN+2 semnalul ar trebui să repete volume funcție, dar clock procesul nu trebuie întrerupt. (Până acum, întregul script (cu toate subprocesele) este încheiat la primirea semnalului)

Întrebat 30/04/2020 la 00:12
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
0

Ceva rescris

Pentru a evita unele furci inutile.

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
Publicat 09/06/2020 la 11:13
sursa de către utilizator

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