每 25 分钟执行一次 CronJob

每 25 分钟执行一次 CronJob

我想知道是否有更简单的方法可以每 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

我没有直接的经验,但是氟龙似乎可以开箱即用地执行您想要的操作。根据其文档您可以指定频率:

# Get our mails every 30 minutes 
@ 30 getmails -all 

# make some security tests every 48 hours of system up time, 
# force a mail to be sent to root even if there is no output 
@mailto(root),forcemail 2d /etc/security/msec/cron-sh/security.sh

答案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它不应该在系统关闭/启动时被删除。

相关内容