( bucko | 2022. 05. 31., k – 13:32 )

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.)