我想知道是否有更简单的方法可以每 25 分钟运行一次作业。在cronjob中,如果将分钟参数指定为*/25,则只会在每小时的第25分钟和第50分钟运行
答案1
crontab 中的命令是用 执行的,/bin/sh
因此您可以使用算术展开来计算当前分钟模 25 是否等于 0:
*/5 * * * * [ $(( $(date +\%s) / 60 \% 25 )) -eq 0 ] && your_command
cron
将每 5 分钟运行整个条目,但只有当当前分钟(自纪元以来的分钟数)模 25 等于 0 时,它才会运行your_command
。
正如其他人指出的,1 天不能被 25 分钟整除,因此这不会导致your_command
每天在同一时间运行,但它将要每 25 分钟运行一次。
答案2
最好的选择是跑 20 分钟或 30 分钟。
接下来最好的办法可能是每 5 分钟触发一次,然后保留内部计数或时间戳,并每 5 个触发运行一次,或者如果自上次运行以来已过去 25 分钟。
更复杂的是计算出一天的正确时间,从午夜开始,并在一天结束时接受错误。这将涉及将 crontab 条目复制到不同的时间。
比这更复杂的是计算出整个月的时间,这将涉及 crontab 条目的许多副本以涵盖不同的组合。
最后,您可以实现自己的始终开启守护进程,并让它进行调度。
答案3
答案4
您可以玩一下文件的最后修改时间
创建一个小脚本(例如
/usr/local/bin/age
)来输出文件的年龄:#bin/sh echo $(( $( date +%s ) - $( stat -c %Z $1 ) ))
你的 crontab 看起来像这样(假设 25 分钟等于 1500 秒,如果我是对的)
* * * * * [ $(/usr/local/bin/fileage /var/tmp/your_command.offset) -gt 1500 ] && touch /var/tmp/your_command.offset && your_command
请注意,我使用/var/tmp
而不是/tmp
因为根据FHS它不应该在系统关闭/启动时被删除。