Unix:休眠到指定时间

NPE*_*NPE 13 unix sleep shell

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

例如: sleeptill 05:00:00

我可以编写一些代码,但如果已经有了一些东西,我宁愿不重新发明轮子。

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

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

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

w00*_*00t 17

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

sleep $(( $(date -j 1700 +%s) - $(date +%s) ))
Run Code Online (Sandbox Code Playgroud)
  • 1700 下午 5 点。
  • -j 告诉 date 不要实际设置日期。

  • @aix:在 Linux(和其他具有 GNU 日期的系统)上,您可以使用 [复杂的日期规范](http://www.gnu.org/software/coreutils/manual/coreutils.html#toc_Date-input-formats),例如如`date -d '明天17:00'`。 (8认同)
  • @NPE,顺便说一句,可以通过使用提醒划分来补偿:`echo $(( ($(date -d "3:00" +%s) - $(date +%s) + (60*60*24) ) % (60*60*24) ))`(可能只有一些关于 DST 更改的问题) (3认同)

Tyl*_*ick 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
}
Run Code Online (Sandbox Code Playgroud)

用法:

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
Run Code Online (Sandbox Code Playgroud)


Jer*_*y L 9

查看 linux/unixat命令。以凌晨 5 点为例:

at 05:00 some_command

它还支持时区:

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