Bash szkript fogási jel, de várjon utána, amíg a folyamatok lezárulnak

szavazat
37

Jelenleg így írok egy bash forgatókönyvet:

foo(){
  while true
  do
    sleep 10
  done
}

bar(){
  while true
  do
    sleep 20
  done
}

foo &
bar &

wait

(Tudom, hogy nincs értelme egy ilyen forgatókönyvnek, csak a struktúráról szól)

Most hozzá akarok adni a jelkezelést a trap -- <doSomething> RTMIN+1 . Ez először működik. Amikor a szkript megkapja az rtmin 1 jelet, akkor megteszi a dolgot, de utána létezik (a 163 kilépési kóddal, amely a küldött jel száma).

Nem ezt a viselkedést akarom. Azt akarom, hogy a jel fogadása után a szkript továbbra is várja a folyamatok (ebben az esetben a két függvény) leállítását (ami természetesen ebben az esetben nem történik meg, de a szkriptnek várnia kell).

Kipróbáltam a hozzáadásával ; wait azokhoz a dolgokhoz, amelyeket meg kell tenni a jel fogadásakor, de ez nem segít (vagy valami rosszat csinálok).

Tud valaki, hogyan érje el a kívánt viselkedést?

Előre köszönöm és legjobbakat kívánom.

SZERKESZTÉS: Talán egy pontosabb példa segít:

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

Most a RTMIN+2 A jelnek újra kell futtatnia a volume funkció, de a clock A folyamatot nem szabad megszakítani. (Mindeddig a teljes szkript (az összes alfolyamattal) a jel vételétől véget ér)

A kérdést 30/04/2020 00:12
felhasználó
Más nyelveken...                            


1 válasz

szavazat
0

Valami átírt

Néhány haszontalan villa elkerülése érdekében.

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
Válaszolt 09/06/2020 11:13
a forrás felhasználó

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