我正在使用 bash,想知道如何在稍后的指定时间执行命令/脚本,精确度为一秒?
我阅读了 - 命令的手册页at
,但据我所知,只能指定分钟(而不是秒)。现在我首先使用at
然后sleep
让它在正确的第二个执行。为了演示,如果我想在 2005 年 21 月 22 日运行 my_script.sh,我会这样做:
echo "sleep 5; my_script.sh" | at 22.21
但如果有一个内置的命令会更好。比如at 22.21.05
.
答案1
我不相信这是可能的。 cron
仅精细到分钟,并且at
实用程序挂钩它来完成它的工作。我认为你有正确的解决办法——睡觉X执行前几秒。
答案2
您可以将您的技术变成一个函数:
atplus () { local sec=${1##*.} time=${1%.*}; shift; echo "sleep $sec; $@" | at $time; }
试试看:
atplus 22.21.05 my_script.sh
但是,您应该知道,精度是无法保证的。
答案3
实际at
可能支持秒
我认为这并不总是得到很好的支持(取决于特定的实现),但原则上at
可能支持秒。
从手册页:
-t时间运行作业于时间,以 [[CC]YY]MMDDhhmm[.ss] 格式给出
看看[.ss]
最后。
这意味着,使用该-t
选项,您可以输入类似的内容
echo "yourscript.sh" | sudo at -t 04281549.45
15:49:45
即该命令应在(45 秒)执行。
(4月28日)
当我尝试时,正如预期的那样,输出at
是:
job 38 at Wed Apr 28 15:49:45 2021
笔记:当我尝试时,仍然迟了几秒钟,但仍然执行了没有之前 15:49:45
,这意味着指定的秒数是不是被at
内部忽略,但实际上是被考虑的。因此,当您想说“延迟此命令运行它不早于15:49:45
”之类的内容时,指定秒数仍然很有用。