Bash scripting, traps and sleep
Today I ran into any old problem: you have a script that should do something when it recieves a signal (e.g. if someone sends it USR1 it should write to a log/syslog), but the script uses a long sleep because it normally only checks/calculates stuff every x min. If you send it a kill -USR1 $pid it will normally execute the trap AFTER the sleep is done, not so great. I figured of the following solution today: put the sleep in a while loop that checks if the full time was slept, and inside the loop a sleep that sleeps the X seconds remaing in the background followed by a wait.
If the script now recieves a USR1 it can kill the wait, execute the trap and will continue the remaining sleep on the next iteration of the loop.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#!/bin/bash
initialize() {
set -o nounset
trap cleanup INT TERM EXIT
trap print_foo USR1
}
cleanup() {
exit 0
}
print_foo() {
echo "foo"
}
initialize
# sleep 1 min
SLEEPTILL=$(date '+%s' --date="+1 min")
while [[ $(date '+%s') -lt ${SLEEPTILL} ]]
do
sleep $(bc <<< "${SLEEPTILL} - $(date '+%s')") &
BACKGROUND=$!
wait $BACKGROUND
done
|