Segnale di cattura dello script Bash, ma attendere la fine dei processi

voti
37

attualmente sto scrivendo uno script bash come questo:

foo(){
  while true
  do
    sleep 10
  done
}

bar(){
  while true
  do
    sleep 20
  done
}

foo &
bar &

wait

(so che non ha senso uno script di questo tipo, si tratta solo della struttura)

Ora voglio aggiungere la gestione del segnale con trap -- <doSomething> RTMIN+1. Questo funziona all'inizio. Quando lo script riceve il segnale rtmin 1 fa qualcosa, ma dopo esiste (con il codice di uscita 163, che è il numero del segnale inviato).

Non è questo il comportamento che voglio. Voglio che dopo aver ricevuto il segnale, lo script continui ad aspettare che i processi (in questo caso le due funzioni) terminino (cosa che ovviamente non accadrà in questo caso, ma lo script dovrebbe aspettare).

Ho provato ad aggiungere una a ; waitalle cose che si dovrebbero fare quando si riceve il segnale, ma questo non aiuta (o sto facendo qualcosa di sbagliato).

Qualcuno sa come ottenere il comportamento desiderato?

Grazie in anticipo e con i migliori auguri.

EDIT: Forse un esempio più preciso aiuta:

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

Ora il RTMIN+2segnale dovrebbe ripetere la volumefunzione, ma il clockprocesso non dovrebbe essere interrotto. (Finora, l'intero script (con tutti i sottoprocessi) viene terminato alla ricezione del segnale)

È pubblicato 30/04/2020 alle 00:12
dall'utente
In altre lingue...                            


1 risposte

voti
0

Qualcosa di riscritto

Per evitare alcune forchette inutili.

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
Risposto il 09/06/2020 a 11:13
fonte dall'utente

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