Το σήμα δέσμευσης σεναρίου Bash αλλά περιμένετε μετά για να τερματιστούν οι διαδικασίες

ψήφοι
37

αυτήν τη στιγμή γράφω ένα σενάριο bash σαν αυτό:

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