Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Is there a (semi-)standard Unix command that would sleep until the time specified on its command line? In other words, I am looking for something similar to sleep that would take wakeup time rather than duration.

For example: sleeptill 05:00:00

I can code something up but would rather not re-invent the wheel if there's already something out there.

Bonus question: it would be great if it could take the timezone (as in sleeptill 05:00:00 America/New_York).

edit Due to the nature of what I am doing, I am looking for a "sleep until T" rather than "run command at T" solution.

edit For the avoidance of doubt, if I run the command at 18:00 and tell it to wake up at 17:00, I expect it to sleep for 23 hours (or, in some corner cases having to do with daylight savings time, for 22 or 24 hours.)

share|improve this question
    
You could use cron, I guess. –  Bobby Dec 15 '10 at 10:30
    
Thanks, but for the intended use it really has to be sleep-like. –  NPE Dec 15 '10 at 10:38
add comment

3 Answers 3

up vote 10 down vote accepted

If you're on a Unix that has a decent date command and are using bash, you could use the %s format for calculating time.

sleep $(( $(date -j 1700 +%s) - $(date +%s) ))

(1700 being 5PM and -j telling date not to actually set the date)

share|improve this answer
    
(+1) for the suggestion. If I run the command at 18:00 and tell it to wake up at 17:00, I expect it to sleep for 23 hours (or, in some corner cases having to do with daylight savings time, for 22 or 24 hours). This is where the suggestion unfortunately breaks down. [I also had to change the -j to -d to make it run on my Linux systems.] –  NPE Dec 15 '10 at 11:38
4  
@aix: On Linux (and other systems with GNU date), you can use sophisticated date specifications such as date -d 'tomorrow 17:00'. –  Gilles Dec 15 '10 at 21:28
    
I'm accepting the answer even though I've ended up writing my own utility. –  NPE Dec 18 '10 at 10:44
1  
@NPE, btw, one can compensate by using reminder-division: echo $(( ($(date -d "3:00" +%s) - $(date +%s) + (60*60*24)) % (60*60*24) )) (there might be only some issues around DST-changes) –  hvr Apr 8 at 7:57
add comment

Check out the linux/unix at command. Using the 5AM example:

at 05:00 some_command

It also supports timezones:

A timezone name of GMT, UCT or ZULU (case insensitive) can follow to specify that the time is in Coordinated Universal Time. Other timezones can be specified using the TZ environment variable.

share|improve this answer
    
(+1) for the suggestion. Unfortunately, it doesn't fit naturally into my workflow. I have a script that runs a bunch of things in sequence, and I want to ensure that certain steps are not kicked off until certain times. This can of course be converted into something that uses cron or at, but it would be a pain to manage. This is the reason I'm looking for something sleep-like. For now, I've written my own. –  NPE Dec 15 '10 at 11:20
    
Ah, so you want a blocking schedule. Why not have a state file keeping track of each step of the process? –  Nerdling Dec 15 '10 at 11:24
    
Could do, but it sounds somewhat more complicated than I think it needs to be. The steps are disparate commands, and the shell script is what orchestrates the workflow. Being able to "sleep till 5pm" in the script is all I really need. –  NPE Dec 15 '10 at 11:28
    
In that case w00t's answer may be precisely what you're after. –  Nerdling Dec 15 '10 at 11:33
    
Yes, it's definitely in the right spirit. Sadly, it breaks down in some important (to me) cases and doesn't do timezones. –  NPE Dec 15 '10 at 11:40
add comment

How about this (combining w00t's and Gille's ideas into a function)?

function sleep_until {
  seconds=$(( $(date -d "$*" +%s) - $(date +%s) )) # Use $* to eliminate need for quotes
  echo "Sleeping for $seconds seconds"
  sleep $seconds
}

Usage:

sleep_until 8:24
Sleeping for 35 seconds

sleep_until '23:00'
Sleeping for 52489 seconds

sleep_until 'tomorrow 1:00'
Sleeping for 59682 seconds
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.