Bash komut dosyası yakalama sinyali ancak daha sonra işlemlerin sona ermesi için bekleyin

oy
37

şu anda böyle bir bash betiği yazıyorum:

foo(){
  while true
  do
    sleep 10
  done
}

bar(){
  while true
  do
    sleep 20
  done
}

foo &
bar &

wait

(Böyle bir senaryoda bir anlamı olmadığını biliyorum, sadece yapı hakkında)

Şimdi ile sinyal işleme eklemek istiyorum trap -- <doSomething> RTMIN+1 . İlk başta çalışır. Komut dosyası rtmin 1 sinyalini aldığında doSomething yapar ancak daha sonra var olur (gönderilen sinyalin sayısı olan 163 çıkış kodu ile).

İstediğim davranış bu değil. Ben sinyal aldıktan sonra, komut dosyası (bu durumda iki işlev) sonlandırmak için beklemek devam ediyor istiyorum (tabii ki bu durumda olmayacak, ama komut dosyası beklemek gerekir).

Bir ekleyerek denedim ; wait sinyal alırken yapılması gerekenler, ancak bu yardımcı olmaz (ya da yanlış bir şey yapıyorum).

İstenen davranışa nasıl ulaşılacağını bilen var mı?

Şimdiden teşekkürler ve en iyi dileklerimle.

EDIT: Belki daha kesin bir örnek yardımcı olur:

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

Şimdi RTMIN+2 sinyal yeniden çalıştırmalı volume işlev, ancak clock süreç kesintiye uğratılmamalıdır. (Şimdiye kadar, tüm komut dosyası (tüm alt süreçlerle) sinyalin alınması üzerine sonlandırılmıştır)

Oluştur 30/04/2020 saat 00:12
kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
0

Yeniden yazılmış bir şey

Bazı işe yaramaz çatalları önlemek için.

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
Cevap 09/06/2020 saat 11:13
kaynak kullanıcı

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