【问题标题】:Cronjob every 25 hours?Cronjob 每 25 小时?
【发布时间】:2010-11-27 21:00:08
【问题描述】:

如何设置每 25 小时运行一次的 cronjob?

【问题讨论】:

  • 这样做的目的是什么?为什么不能接受 24 小时?
  • 来自 Google 的合法用例是为了避免超过对时间不是特别敏感的定期作业的每日 API 限制。为了保守起见,增加一个额外的小时并避免夏令时错误。

标签: cron


【解决方案1】:

如果您计算自Epoch 以来的小时数(、分钟、天或周),您可以实现任何频率,在脚本顶部添加条件,并将脚本设置为在您的 crontab 上每小时运行一次:

#!/bin/bash

hoursSinceEpoch=$(($(date +'%s / 60 / 60')))

# every 25 hours
if [[ $(($hoursSinceEpoch % 25)) -ne 0 ]]; then
    exit 0
fi

date(1) 返回当前日期,我们将其格式化为自 Epoch (%s) 以来的秒数,然后我们进行基本数学运算:

# .---------------------- bash command substitution
# |.--------------------- bash arithmetic expansion
# || .------------------- bash command substitution
# || |  .---------------- date command
# || |  |   .------------ FORMAT argument
# || |  |   |      .----- formula to calculate minutes/hours/days/etc is included into the format string passed to date command
# || |  |   |      |
# ** *  *   *      * 
  $(($(date +'%s / 60')))
# * *  ---------------
# | |        | 
# | |        ·----------- date should result in something like "1438390397 / 60"
# | ·-------------------- it gets evaluated as an expression. (the maths)
# ·---------------------- and we can store it

您可以将此方法用于每分钟、每小时、每天或每月的 cron 作业:

#!/bin/bash
# We can get the

minutes=$(($(date +'%s / 60')))
hours=$(($(date +'%s / 60 / 60')))
days=$(($(date +'%s / 60 / 60 / 24')))
weeks=$(($(date +'%s / 60 / 60 / 24 / 7')))

# or even

moons=$(($(date +'%s / 60 / 60 / 24 / 656')))

# passed since Epoch and define a frequency
# let's say, every 13 days

if [[ $(($days % 13)) -ne 0 ]]; then
    exit 0
fi

# and your actual script starts here

【讨论】:

    【解决方案2】:

    我觉得你应该试试这个

    0 */25 * * * ...
    

    【讨论】:

    • 您不能设置超过 23 小时的频率
    【解决方案3】:

    设置一个每小时的工作,如果 25 小时过去了,则使用此 snipnet 签入您的脚本:

    if [ $((((`date +%s` - (`date +%s` % 3600))/3600) % 25)) -eq 0 ] ; then
     your script 
    fi
    

    【讨论】:

    • 我们将不胜感激。此代码生成时间戳(自纪元以来的秒数),将其转换为小时并检查模 25(因此每 25 小时)。如果需要,将“-eq 0”更改为“-eq 10”以更改特定日期的小时...
    【解决方案4】:

    您可以使用“睡眠”或“观看”命令让脚本循环运行。只要确保你的脚本被执行。

    【讨论】:

      【解决方案5】:

      当您启动当前作业时,发出 at 命令指定下一个作业的时间和日期会更容易,但您可以通过在开始时更新进程的 cronjob 条目来使用 cronjob 模拟它当前运行(不是在最后,因为你必须考虑运行作业的时间)。

      【讨论】:

      • 如果你错过了一项工作,at 技巧可能会失败,例如,如果系统在计划运行时出现故障。
      【解决方案6】:

      只是猜测,但你没有

      我头脑中的最佳技巧:编写一个脚本来跟踪它的最后一次运行时间,如果超过 25 小时,则有条件地运行它。

      Cron 驱动程序脚本每小时运行一次。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-05
        相关资源
        最近更新 更多