场景:一个叫做“随时随地”的宝石。将ruby代码转换为crontab命令,然后将该代码写入名为schedule.rb
的文件中,该文件一旦运行就会转换为crontab文件。
我的schedule.rb
中有一个片段,它会每15分钟执行一次Active Record模型中的方法,然后会在任务文件中写一个日志,说明"完成"但是,如果我随时做某事,就没有任何事情发生。
当我在浏览器上手动运行模型,控制器和视图时,模型,控制器和视图工作正常,但如果我将其保留为自动模式,它将无法做任何事情。
所以,对于schedule.rb
set :output, "#{path}/tareas.log"
every 15.minutes do
rake "article.fetcharticles"
command "echo'done'"
end
将其翻译成crontab文件:
0,15,30,45 * * * * /bin/bash -l -c 'cd/root/aggregrator && RAILS_ENV=development bundle exec rake article.fetcharticles --silent >> /root/aggregrator/tareas.log
fetcharticles
方法只是模型(文章)中的一个def,它有一个curl like命令可以正常工作,就像我说的那样,当我从firefox手动运行时。
我还有什么需要做的吗?
所以,其他帖子说的是“每当'没有在开发环境上工作,但在生产中。嗯,那篇文章是从2011年开始的,所以我希望“无论什么时候”#到目前为止已经修复了,因为如果我尝试更改为服务器。-e生产我会得到关于密钥配置等的错误并且它不会启动,所以我仍处于开发模式。
然后另一个人写道:
您使用的是RVM吗?如果是这样,每当生成这样的crontab条目时(是的,就像我的一样)
他的解决方案是:
要使其工作,您需要将适当的.rvmrc文件添加到项目的根文件夹中。
但是,我该怎么做?
他的帖子在这里,但没有得到批准的答案。
Whenever cron job is not working in rails 3
更新:
这个问题似乎指向没有所需文件的方向,可能与报告的rmv问题有关,但是看到我的tareas.log文件中的错误日志,我看到了,(显示一个片段) )
/usr/local/rvm/gems/ruby-2.2.0@global/gems/bundler-1.9.1/lib/bundler/spec_set.rb:92:in `block in materialize': Could not find i18n-0.7.0 in any of the sources (Bundler::GemNotFound)
from /usr/local/rvm/gems/ruby-2.2.0@global/gems/bundler-1.9.1/lib/bundler/spec_set.rb:85:in `map!'
from /usr/local/rvm/gems/ruby-2.2.0@global/gems/bundler-1.9.1/lib/bundler/spec_set.rb:85:in `materialize'
from /usr/local/rvm/gems/ruby-2.2.0@global/gems/bundler-1.9.1/lib/bundler/definition.rb:132:in `specs'
from /usr/local/rvm/gems/ruby-2.2.0@global/gems/bundler-1.9.1/lib/bundler/definition.rb:177:in `specs_for'
from /usr/local/rvm/gems/ruby-2.2.0@global/gems/bundler-1.9.1/lib/bundler/definition.rb:166:in `requested_specs'
from /usr/local/rvm/gems/ruby-2.2.0@global/gems/bundler-1.9.1/lib/bundler/environment.rb:18:in `requested_specs'
from /usr/local/rvm/gems/ruby-2.2.0@global/gems/bundler-1.9.1/lib/bundler/runtime.rb:13:in `setup'
from /usr/local/rvm/gems/ruby-2.2.0@global/gems/bundler-1.9.1/lib/bundler.rb:122:in `setup'
from /usr/local/rvm/gems/ruby-2.2.0@global/gems/bundler-1.9.1/lib/bundler/setup.rb:18:in `<top (required)>'
from /usr/local/rvm/rubies/ruby-2.2.0/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /usr/local/rvm/rubies/ruby-2.2.0/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /root/aggregrator/config/boot.rb:3:in `<top (required)>'
from bin/rails:7:in `require_relative'
所提供的解决方案都没有解决问题的核心问题,因为问题在于缺少文件,正如我在撰写初始帖子时指出的那样
答案 0 :(得分:1)
你做了一个名为article.fetcharticles的rake任务吗?如果没有,那么每当错误的方式你都在使用。当您指定要运行的方法时,您正在指定rake任务,如下所示:
runner "Article.fetcharticles"
代替你的
rake "article.fetcharticles"
答案 1 :(得分:1)
如果您希望它在本地工作,您必须自己安装crontab。每当在开发中不起作用的评论都不是随时出现的问题;无论何时不打算在您的开发环境中工作。我们的想法是,它应该用于在服务器上设置cron条目,这通常是登台或生产服务器。这通常是作为部署过程的一部分完成的;通常使用capistrano。
因此,要使其在本地运行,您必须在本地计算机上安装此cron配置。您可以通过生成文件并将其复制到/etc/cron.d/
来实现。但是,请记住,在开发环境中手动运行任务通常会更好。
最后,如果您正在尝试调试cron条目失败的原因,那么无论如何都值得尝试手动运行命令。例如:
/bin/bash -l -c 'cd/root/aggregrator && RAILS_ENV=development bundle exec rake article.fetcharticles --silent >> /root/aggregrator/tareas.log
实际上成功运行。我认为你会在cd/roo/aggregator
生成没有这样的文件或目录的情况下直接收到错误。