Unix:睡眠直到指定时间


12

是否有一个(半)标准的Unix命令会一直休眠直到其命令行上指定的时间?换句话说,我正在寻找与sleep唤醒时间而不是持续时间类似的东西。

例如: sleeptill 05:00:00

我可以编写一些东西,但是如果已经有东西的话,宁愿不要重新发明轮子。

额外的问题:如果可以采用时区(如所示sleeptill 05:00:00 America/New_York),那就太好了。

编辑由于我正在做的性质,我正在寻找“直到T睡觉”而不是“在T上运行命令”的解决方案。

编辑为了避免疑问,如果我在18:00运行命令并告诉它在17:00醒来,我希望它可以睡眠23个小时(或者在某些情况下与夏时制有关, 22或24小时。)


cron我猜您可以使用。
鲍比2010年

谢谢,但是对于预期的用途,它实际上必须是sleep-like。
NPE 2010年

Answers:


18

如果您使用的是具有适当日期命令的Unix,并且正在使用bash,则可以使用%s格式来计算时间。

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

(1700是5 PM,-j告诉日期未实际设置日期)


(+1)作为建议。如果我在18:00运行命令并告诉它在17:00醒来,我希望它休眠23个小时(或者在某些极端情况下与夏时制有关,则休眠22或24个小时)。不幸的是,这是该建议分解的地方。[我也不得不改变-j-d。让它在我的Linux系统上运行]
NPE

7
@aix:在Linux(和其他带有GNU日期的系统)上,可以使用复杂的日期规范,例如date -d 'tomorrow 17:00'
吉尔斯(Gillles)“所以-别再作恶了”

3
@NPE,顺便说一句,可以通过使用提醒分区来补偿:echo $(( ($(date -d "3:00" +%s) - $(date +%s) + (60*60*24)) % (60*60*24) ))(DST更改周围可能只有一些问题)
hvr 2014年

13

怎么样(将w00t和Gille的思想组合成一个函数)?

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

用法:

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

9

签出linux / unix at命令。使用5AM示例:

at 05:00 some_command

它还支持时区:

可以跟随GMT,UCT或ZULU(不区分大小写)的时区名称来指定时间为协调世界时。可以使用TZ环境变量指定其他时区。


(+1)作为建议。不幸的是,它不自然地适合我的工作流程。我有一个脚本,可以按顺序运行一堆东西,并且我想确保某些步骤要到某些时候才能启动。当然可以将其转换为使用cron或的内容at,但是要进行管理很麻烦。这就是我要寻找类似东西的原因sleep。现在,我已经写了自己的书。
NPE 2010年

嗯,所以您想要一个阻止计划。为什么不使用状态文件来跟踪过程的每个步骤?
杰里米·L 2010年

可以做到,但是听起来比我想的要复杂。这些步骤是完全不同的命令,而shell脚本是协调工作流程的内容。我真正需要的就是能够“睡到下午5点”。
NPE 2010年

在这种情况下,w00t的答案可能正是您所追求的。
杰里米·L 2010年

是的,绝对是正确的精神。可悲的是,在某些重要的情况下(对我而言)它崩溃了,并且没有时区。
NPE 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.