http://qs321.pair.com?node_id=11111528


in reply to Re: Signal to a sleeping Perl program
in thread Signal to a sleeping Perl program

One way would be to break up the 15 minute sleep into smaller mini-sleeps. Presumably, waking up would allow your script to respond to the request to terminate.

Any signal, or at least any non-ignored signal interrupts sleep. No need for polling. See also sleep:

Causes the script to sleep for (integer) EXPR seconds, or forever if no argument is given. Returns the integer number of seconds actually slept.

May be interrupted if the process receives a signal [...]

Note: sleep() returns how long it actually slept, so your program can continue sleeping for the remaining time if some signal happened in between.

The C API sleep() behaves similar, see sleep(3), but it returns the remaining sleep time, not the time actually slept.

Alexander

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)

Replies are listed 'Best First'.
Re^3: Signal to a sleeping Perl program
by QM (Parson) on Jan 20, 2020 at 10:59 UTC
    Any signal, or at least any non-ignored signal interrupts sleep.

    Many forget this, and expect that a literal sleep 60 may not actually take 60s, but could be anything less than that. In one-off scripts I've seen code like this (untested):

    sub my_sleep { my $sleep_time = (shift or 1); # total time to sleep my $sleep_interval = (shift or 10); # wake up at least this often my $start = time; $stop_time = $start + $sleep_time; while (time < $stop_time) { sleep $sleep_time; # handle wake up tasks } my $elapsed = time - $start; return $elapsed; # total time actually slept (plus shipping and ha +ndling) }

    You may want additional conditions, and use this as a timeout mechanism. There's probably a nice module for that, or roll your own.

    But the point is sleep comes with an unspoken if (...), if something else doesn't wake me up.

    -QM
    --
    Quantum Mechanics: The dreams stuff is made of