Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

Re: Signal to a sleeping Perl program

by talexb (Chancellor)
on Jan 17, 2020 at 14:48 UTC ( [id://11111525]=note: print w/replies, xml ) Need Help??


in reply to 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.

Alex / talexb / Toronto

Thanks PJ. We owe you so much. Groklaw -- RIP -- 2003 to 2013.

Replies are listed 'Best First'.
Re^2: Signal to a sleeping Perl program
by afoken (Chancellor) on Jan 17, 2020 at 15:29 UTC
    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". ;-)
      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

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11111525]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others sharing their wisdom with the Monastery: (4)
As of 2024-04-26 00:15 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found