Bash skript zachytí signál, ale poté čeká na ukončení procesů

hlasů
37

v současné době píšu bash skript, jako je tento:

foo(){
  while true
  do
    sleep 10
  done
}

bar(){
  while true
  do
    sleep 20
  done
}

foo &
bar &

wait

(Vím, že takový skript nemá smysl, je to jen o struktuře)

Nyní chci přidat zpracování signálu trap -- <doSomething> RTMIN+1 . Nejprve to funguje. Když skript přijme signál rtmin 1, udělá doSomething, ale poté existuje (s výstupním kódem 163, což je číslo vysílaného signálu).

Toto není chování, které chci. Chci, aby po přijetí signálu skript nadále čekal na ukončení procesů (v tomto případě dvou funkcí) (což se samozřejmě v tomto případě nestane, ale skript by měl počkat).

Zkusil jsem to s přidáním a ; wait k věcem, které by se měly dělat při příjmu signálu, ale to nepomůže (nebo dělám něco špatně).

Ví někdo, jak dosáhnout požadovaného chování?

Díky předem as přáním všeho nejlepšího.

EDIT: Možná přesnější příklad pomůže:

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

Teď RTMIN+2 signál by měl znovu spustit volume funkce, ale clock proces by neměl být přerušen. (Doposud je celý skript (se všemi podprocesy) ukončen po přijetí signálu)

Položena 30/04/2020 v 00:12
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
0

Něco přepsáno

Abychom se vyhnuli zbytečným vidličkám.

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
Odpovězeno 09/06/2020 v 11:13
zdroj uživatelem

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