Próbáld meg a link helyett a fenti programot futtatni. ;)
Ott van alul a futás eredménye is. Hol lép ki???
A probléma a "sleep folyamatát lőném ki kívülről" dologban van. Vajon hány szkriptet szertnél írni, amikor egyet sem látsz át?
abbahagyja a szkriptem fő loopját
Ott van, amit írtam, az potosan a szkriptednek a modellje. A signal handler nem hagyat abba semmit, csak az éppen hosszabb ideig futó parancsot. Esetünkben sajnos a sleep nem ilyen, ezért kell a sleeep 30 & ; wait kombó. Tehát a wait kilép, lefut a handler, majd a wait utáni soron folytatódik.
Az első program működése: 10 másodpercenként frissít, de ha külső esemény jön, akkor azonnal frissít és újrakezdi a 10 másodperces kört.
Itt egy másik változat, ami: 10 másodpercenként frissít. Ha külső esemény érkezik, akkor beiktat egy extra frissítést, de nem lő ki semmit.
#!/bin/bash
do_nothing()
{
echo "Caught SIGUSR1"
}
trap do_nothing SIGUSR1
echo "Sleeping. Pid=$$"
while :
do
sleep 10 &
SLEEP_PID=$!
while ps -C -p $SLEEP_PID >/dev/null 2>&1
do
wait $SLEEP_PID
done
echo "Sleep over"
done
A futás:
>p1 &
[1] 452
Sleeping. Pid=452
Sleep over
Sleep over
>kill -SIGUSR1 452
Caught SIGUSR1
>kill -SIGUSR1 452
Caught SIGUSR1
Sleep over
>kill -SIGUSR1 452
Caught SIGUSR1
Sleep over
fg
p1
^C
>
Szerinted ez hol lép ki? (A végén a ^C hatására.)