5

我很难将 Cron 作业设置为每天在设定的时间运行一次。这是我的模块配置中的内容:

<crontab>
    <jobs>
        <sorting_flushcache>
            <schedule><cron_expr>0 16 * * *</cron_expr></schedule>
            <run><model>sorting/observer::flushProductCacheCron</model></run>
        </sorting_flushcache>
    </jobs>
</crontab>

根据我对 cron 作业的了解,它应该根据我当地的时区在下午 5 点运行。但是,它永远不会起作用。如果我改为将cron_expr设置为* 16 * * *它会在整个小时内每分钟安排一次作业(如您所料)。

我跟踪了代码,我认为我发现了问题,但我对 cron 调度以及它应该如何工作的了解不够,所以我希望有人能帮助我了解哪里出了问题以及如何让我的工作正常工作。

Mage_Cron_Model_Schedule是野兽的大脑。当服务器的 crontab 调度调用cron.php脚本时,它会调度此类捕获并执行其工作的事件。除其他外,它会引入配置并尝试安排即将到来的 cron 作业。在public function trySchedule($time)它内部调用matchCronExpression,将相关的 cron 表达式连同与该 cron 表达式对应的当前时间的值一起传递给它。例如,它将cron_expr的第一部分(分钟部分)与当前时间戳的分钟进行比较。在matchCronExpression函数的末尾,它返回一个布尔值,如下所示:

return ($num>=$from) && ($num<=$to) && ($num%$mod===0);

就我而言,我的cron_expr0 16 * * *. 由于我的分钟部分没有任何范围或*/5类型的内容,因此它将我设置的确切值与当前时间戳的确切值进行比较。这意味着只有在应该安排该作业的确切时间运行 cron 脚本时,它才会返回 true。

同样,我不是 cron 专家,但这对我来说似乎不对。那么,如果您无法预测 cron 调度程序运行脚本的确切时间,应该如何安排作业每天运行一次呢?我真的希望我错过了什么……有人可以帮忙吗?

-- CRON 配置信息 --

generate schedules every: 5
schedule ahead for: 10
missed if not run within: 20
success history lifetime: 60
failure history lifetime: 600
4

1 回答 1

3

我可能已经找到了这个问题的“解决方案”,但我不确定这可能产生的影响。希望其他人可以加入确认或提供更好的答案。

我在 Magento 中更改了我的 Cron 配置,如下所示:

generate schedules every: 1
schedule ahead for: 5
missed if not run within: 20
history cleanup every: 30
success history lifetime: 60
failure history lifetime: 600

这似乎成功了。它现在每分钟生成一次时间表,因此它不会错过安排我每天一次的活动的窗口。

对此有什么想法吗?我担心系统每分钟都生成 cron 计划太多了。它应该能够处理它,但我必须进行测试才能确认。

其他人有类似的经历吗?你是怎么解决的?

于 2012-04-20T17:51:06.153 回答