我很难将 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 脚本时,它会分派(dispatch)此类捕获的事件并完成其工作。除其他外,它会引入配置并尝试安排即将到来的 cron 作业。在 public function trySchedule($time) 中,它调用 matchCronExpression,将相关的 cron 表达式片段以及与该片段对应的当前时间值传递给它cron 表达式。例如,它将 cron_expr 的第一部分(分钟 部分)与当前时间戳的分钟数进行比较。在 matchCronExpression 函数的末尾,它返回一个 bool 值,如下所示:
return ($num>=$from) && ($num<=$to) && ($num%$mod===0);
在我的例子中,我的 cron_expr 是 0 16 * * *。由于我的 minutes 部分没有任何范围或 */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
最佳答案
我可能已经找到了这个问题的“解决方案”,但我不确定这可能产生的影响。希望其他人可以插话确认或提供更好的答案。
我在 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 计划太多了。它应该能够处理它,但我必须进行测试才能确认。
有没有人有类似的经历?你是怎么解决的?
关于php - Magento 的 Cron 从根本上有缺陷吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10237446/
有几种方法:first_or_create_by、find_or_create_by等,它们的工作原理是:与数据库对话以尝试找到我们想要的东西如果我们找不到,就自己做保存到数据库显然,并发调用这些方法可能会使两个线程都找不到它们想要的东西,并且在第3步中一个线程会意外失败。似乎更好的解决方案是,创建或查找即:提前在您的数据库中创建合理的唯一性约束。如果你想保存一些东西,就保存它如果有效,那就太好了。如果它因为RecordNotUnique异常而无法工作,它已经存在,太好了,加载它那么在什么情况下我想使用Rails内置的东西而不是我自己的(看起来更可靠)create_or_find?
我以前没有使用过cron,所以我不能确定我这样做是对的。我想要自动化的任务似乎没有运行。我在终端中执行了这些步骤:sudogeminstall每当切换到应用程序目录无论何时。(这创建了文件schedule.rb)我将此代码添加到schedule.rb:every10.minutesdorunner"User.vote",environment=>"development"endevery:hourdorunner"Digest.rss",:environment=>"development"end我将此代码添加到deploy.rb:after"deploy:symlink","depl
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它
我有一个bash脚本,它运行一个ruby脚本来获取我的Twitter提要。##/home/username/twittercron#!/bin/bashcd/home/username/twitterrubytwitter.rbfriends命令行运行成功/home/username/twittercron但是当我尝试将它作为cronjob运行时,它运行了但无法获取提要。##crontab-e*/15*****/home/username/twittercron脚本已经chmod+x。不知道为什么会这样。有什么想法吗? 最佳答案
我正在尝试在RVM环境中运行10.5的旧PPC机器上运行一个简单的ruby脚本。在SO上搜索,我遵循了这个post中选择的答案.这是cron中的结果行:SHELL=/bin/bash00****BASH_ENV=~/.bash_profile&&/bin/bash-c'~/deggy/onlineGW.rb'此命令在用户sam的根目录下的Bash中运行良好。这是我脚本的重要部分:#!/usr/bin/envrubyrequire'open-uri'require'nokogiri'...这是cron的错误输出:X-Cron-Env:X-Cron-Env:X-Cron-Env:X-C
我尝试每天在我的Rails应用程序中自动记录一些数据。我想知道是否有人知道一个好的解决方案?我找到了https://github.com/javan/whenever,但我想确保在选择之前了解所有选项。谢谢!艾略特 最佳答案 我真的很喜欢whenever-这是一个很棒的Gem,我已经在生产中使用了它。关于它还有一个很好的Railscasts插曲:http://railscasts.com/episodes/164-cron-in-ruby 关于ruby-on-rails-rails3中c
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我使用PHP的时间太长了,对它感到厌倦了。我也想学习一门新语言。我一直在使用Ruby并且喜欢它。我必须在Rails和Sinatra之间做出选择,那么您会推荐哪一个?Sinatra真的不能用来构建复杂的应用程序,它只能用于简单的应用程序吗?
理想使用rvm,如果能够在一个网络服务器上拥有多个Rubies,并且通过某种服务器配置,能够在每个项目的基础上将Ruby版本分配给不同的Rails/Sinatra/等应用程序,那将是非常棒的。我从rvm的文档中了解到,Passenger一次只能使用一个Ruby。:(妥协否则,至少能够想出一种方法将项目分配给Ruby1.8或Ruby1.9解释器会很好。我读过使用Nginx作为反向代理允许在同一个盒子上运行Apache和Nginx。那么是否有可能让Apache+Passenger使用一个Ruby,而Nginx+Passenger使用另一个?也许在Nginx中使用Passenger以外的东西
是否有rubygem/插件可以将*/10***1,3转换为“周一、周三每10分钟触发一次”? 最佳答案 我什么都不知道,我也没有用谷歌找到任何东西。不过,您也许可以自己破解一些东西:>>cron="*/10***1,3foo"#=>"*/10***1,3foo">>min,hour,dom,month,dow,command=cron.split#=>["*/10","*","*","*","1,3","foo"]一旦你有了变量,你就可以开始组装输出的部分了:>>require'date'#=>true>>dow.split(/
我正在尝试在Rails3.0.9(使用RVM)中使用crontab运行Rake任务,但它不起作用。但是当我在控制台中运行时它工作正常我的佣金任务namespace:alertdodesc"createsomeremindernotification"task:send_reminder=>:environmentdop"mytaskgoeshere----"endend我的定时任务*/1****cd/home/anu-karthik/Documents/billguru/&&/home/anu-karthik/.rvm/gems/ruby-1.9.2-p0/bin/rakealert: