睡眠直到下一次出现特定时间

Bra*_*one 12 bash sleep date time

我需要一系列命令或单个命令,直到下一次出现“4:00”等特定时间。

我该怎么做?

at命令或一个cronjob不是一个选项,因为我不能离开这个剧本目前在我。

我所说的具体情况是在屏幕中运行的脚本。非常重要的是,我不会通过脚本本身停止脚本的执行,因为脚本的某些点需要存储许多重要的变量。脚本并不总是应该以常规方式执行。它只需要在特定时间执行。

如果脚本必须创建任何文件或任何其他任务(例如 cronjobs 或其他屏幕),那将是非常有益的。这只是一个设计问题。

我只是有一个很棒的想法:

difference=$(($(date -d "4:00" +%s) - $(date +%s)))

if [ $difference -lt 0 ]
then
    sleep $((86400 + difference))
else
    sleep $difference
fi
Run Code Online (Sandbox Code Playgroud)

你有什么更好的想法吗?

如果需要,将添加更多信息!

Bra*_*one 20

terdon 的建议可行,但我想我的建议效率更高。

difference=$(($(date -d "4:00" +%s) - $(date +%s)))

if [ $difference -lt 0 ]
then
    sleep $((86400 + difference))
else
    sleep $difference
fi
Run Code Online (Sandbox Code Playgroud)

这是计算给定时间和当前时间之间的差异(以秒为单位)。如果数字是负数,我们必须加上一整天的秒数(准确地说是 86400)才能得到我们必须睡觉的秒数,如果数字是正数,我们就可以使用它。


ter*_*don 12

假设它是一个 shell 脚本,这应该可以工作:

while [ $(date +%H:%M) != "04:00" ]; do sleep 1; done
Run Code Online (Sandbox Code Playgroud)

那是24小时的时间。如果您希望在凌晨 4:00 和下午 4:00 继续执行此操作,请改用以下命令:

while [ $(date +%I:%M) != "04:00" ]; do sleep 1; done
Run Code Online (Sandbox Code Playgroud)