αυτήν τη στιγμή γράφω ένα σενάριο 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
η διαδικασία δεν πρέπει να διακοπεί. (Μέχρι τώρα, ολόκληρο το σενάριο (με όλες τις υποεπεξεργασίες) τερματίζεται κατά τη λήψη του σήματος)