Бэш-скрипт ловит сигнал, но ждет, пока процессы не завершатся

голоса
37

В настоящее время я пишу такой бэш-скрипт:

foo(){
  while true
  do
    sleep 10
  done
}

bar(){
  while true
  do
    sleep 20
  done
}

foo &
bar &

wait

(Я знаю, что в таком сценарии нет смысла, речь идет только о структуре)

Теперь я хочу добавить обработку сигналов с помощью trap -- <doSomething> RTMIN+1. Поначалу это работает. Когда скрипт получает сигнал rtmin 1, он что-то делает, но потом он существует (с кодом выхода 163, который является номером посылаемого сигнала).

Это не то поведение, которого я хочу. Я хочу, чтобы после получения сигнала, скрипт продолжает ждать, пока процессы (в данном случае две функции) завершатся (что, конечно, не произойдет в этом случае, но скрипт должен ждать).

Я попробовал это с добавлением a ; waitк вещам, которые должны быть сделаны при получении сигнала, но это не помогает (или я делаю что-то не так).

Кто-нибудь знает, как добиться желаемого поведения?

Заранее спасибо и с наилучшими пожеланиями.

EDIT: Может быть, более точный пример помогает:

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

Сейчас RTMIN+2сигнал должен перезапустить volumeфункцию, но clockпроцесс не должен быть прерван. (До сих пор весь скрипт (со всеми подпроцессами) завершается при получении сигнала)

Задан 30/04/2020 в 00:12
источник пользователем
На других языках...                            


1 ответов

голоса
0

Что-то переписанное

Чтобы избежать бесполезных вил.

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
Ответил 09/06/2020 в 11:13
источник пользователем

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