如何让脚本休眠至systemd计时器日历时间触发?
如何让脚本休眠至systemd计时器日历时间触发?
嘿,刚好我也研究过类似的需求!目前确实没有官方提供的systemd-timer-sleep这类一键式命令,但我们可以用systemd自带的工具实现类似效果,不用自己手动计算秒数,完全符合你想要的简单方式:
方法1:用systemd-run创建临时等待Timer
这是最贴合systemd timer逻辑的方式,我们可以创建一个一次性的临时timer,让它在指定的日历时间触发,同时让命令阻塞直到触发完成:
systemd-run --user --on-calendar="03:00" --wait true
--user:用当前用户的会话运行,不需要root权限;如果是系统级脚本,可以去掉这个参数,用root执行--on-calendar="03:00":直接使用systemd的日历时间格式,你可以换成任何符合要求的表达式(比如*-*-* 03:00:00、Mon *-*-* 10:00等)--wait:让systemd-run命令一直阻塞,直到timer触发并执行完后面的命令true:是timer触发后执行的无意义命令,只是为了满足语法要求,不会产生任何实际输出
执行这条命令后,你的脚本就会一直等待,直到下一个3:00am到来。
方法2:用systemd-analyze计算休眠秒数
如果不想创建临时的systemd服务,也可以用systemd-analyze把日历时间转换成Unix时间戳,再计算出需要休眠的秒数,传给sleep命令:
sleep "$(($(systemd-analyze calendar "03:00" --output=unix-epoch) - $(date +%s)))"
systemd-analyze calendar "03:00" --output=unix-epoch:会输出下一个匹配03:00的时间点的Unix时间戳$(date +%s):获取当前时间的Unix时间戳- 两者相减得到需要休眠的秒数,直接传给
sleep命令
这个方法更轻量,不需要依赖systemd的服务管理,但同样能直接复用systemd的日历时间语法,省去自己解析日期的麻烦。
备注:内容来源于stack exchange,提问作者Amandasaurus
相关产品推荐
相关产品推荐

