Bash-Skript-Fangsignal, aber warten Sie danach auf die Beendigung von Prozessen

stimmen
37

derzeit schreibe ich ein Bash-Skript wie dieses:

foo(){
  while true
  do
    sleep 10
  done
}

bar(){
  while true
  do
    sleep 20
  done
}

foo &
bar &

wait

(Ich weiß, dass ein solches Skript keinen Sinn hat, es geht nur um die Struktur)

Jetzt möchte ich die Signalverarbeitung mit trap -- <doSomething> RTMIN+1. Dies funktioniert zunächst einmal. Wenn das Skript das Signal rtmin 1 empfängt, tut es etwas, aber danach existiert es (mit dem 163-Exit-Code, der die Nummer des gesendeten Signals ist).

Das ist nicht das Verhalten, das ich will. Ich möchte, dass das Skript nach dem Empfang des Signals weiterhin auf die Beendigung der Prozesse (in diesem Fall der beiden Funktionen) wartet (was in diesem Fall natürlich nicht passieren wird, aber das Skript sollte warten).

Ich habe es mit dem Hinzufügen von a ; waitzu den Dingen, die beim Empfang des Signals getan werden sollten, versucht, aber das hilft nicht (oder ich mache etwas falsch).

Weiß jemand, wie das gewünschte Verhalten erreicht werden kann?

Danke im Voraus und mit besten Wünschen.

EDIT: Vielleicht hilft ein präziseres Beispiel:

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

Nun sollte das RTMIN+2Signal die volumeFunktion erneut ausführen, aber der clockProzess sollte nicht unterbrochen werden. (Bis jetzt wird das gesamte Skript (mit allen Unterprozessen) beim Empfang des Signals beendet)

Veröffentlicht am 30/04/2020 um 00:12
vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
0

Etwas umgeschrieben

Um einige nutzlose Gabeln zu vermeiden.

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
Beantwortet am 09/06/2020 um 11:13
quelle vom benutzer

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