बैश स्क्रिप्ट सिग्नल पकड़ती है लेकिन प्रक्रियाओं के समाप्त होने का इंतजार करती है

वोट
1

वर्तमान में मैं इस तरह से एक बैश स्क्रिप्ट लिख रहा हूँ:

foo(){
  while true
  do
    sleep 10
  done
}

bar(){
  while true
  do
    sleep 20
  done
}

foo &
bar &

wait

(मुझे पता है कि इस तरह की स्क्रिप्ट का कोई मतलब नहीं है, यह सिर्फ संरचना के बारे में है)

अब मैं सिग्नल हैंडलिंग के साथ जोड़ना चाहता हूं trap -- <doSomething> RTMIN+1 । यह पहली बार में काम करता है। जब स्क्रिप्ट को rtmin 1 सिग्नल प्राप्त होता है तो यह doSomething करता है लेकिन बाद में यह मौजूद होता है (163 एक्जिट कोड के साथ, जो सिग्नल भेजे जाने की संख्या है)।

यह वह व्यवहार नहीं है जो मैं चाहता हूं। मैं चाहता हूं कि सिग्नल प्राप्त करने के बाद, स्क्रिप्ट प्रक्रिया (इस मामले में दो कार्यों) को समाप्त करने के लिए इंतजार करना जारी रखे (जो इस मामले में निश्चित रूप से नहीं होगा, लेकिन स्क्रिप्ट को इंतजार करना चाहिए)।

मैंने इसे जोड़ने की कोशिश की ; wait सिग्नल प्राप्त करते समय उन चीजों को किया जाना चाहिए, लेकिन यह मदद नहीं करता है (या मैं कुछ गलत कर रहा हूं)।

क्या किसी को पता है कि वांछित व्यवहार कैसे प्राप्त किया जाए?

अग्रिम धन्यवाद और शुभकामनाओं के साथ।

संपादित करें: शायद अधिक सटीक उदाहरण मदद करता है:

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