1

我正在使用SidekiqandClockwork用于后台作业和调度。我lib/clock.rb的下一个代码用于执行一些 rake 任务:

require 'clockwork'
require File.expand_path('../../config/boot',        __FILE__)
require File.expand_path('../../config/environment', __FILE__)
require 'sidekiq'

include Clockwork
include Sidekiq

module Clockwork    
  every(1.day, 'rake places:get_from_api', at: '22:45') do
    Sidekiq.logger.info 'Starting rake places:get_from_api'
    execute_rake('places.rake', 'places:get_from_api') if Rails.env.production?
  end
end

def execute_rake(file,task)
  require 'rake'
  rake = Rake::Application.new
  Rake.application = rake
  Rake::Task.define_task(:environment)
  load "#{Rails.root}/lib/tasks/#{file}"
  rake[task].invoke
end

我在 EngineYard 上部署应用程序并有一个after_restart.rb钩子:

if environment == 'production'
  cw_pid_file = "#{shared_path}/pids/clockwork.pid"
  # stop clockwork
  run "if [ -d #{current_path} ] && [ -f #{cw_pid_file} ]; then cd #{current_path} && kill -int $(cat #{cw_pid_file}) 2>/dev/null; else echo 'clockwork was not running' ; fi"
  ## start clockwork
  run "cd #{current_path} && bundle exec clockworkd -c #{current_path}/lib/clock.rb --pid-dir #{shared_path}/pids --log --log-dir #{shared_path}/log restart >> log/clockwork.log 2>&1 &"
  run "ps -eo pid,command | grep clockwork | grep -v grep | awk '{print $1}' > #{cw_pid_file}"
end

部署后,我在日志中看到异常。clockworkd.clock.output

如何修复它?

4

1 回答 1

1

引擎场工作人员在这里。

查看您的错误,您正试图在某处调用 Nil 上的 each 语句。可能在您的自定义 rake 任务中。如果不查看您的更多代码,我们将无法真正调试它。

我也可以推荐普通的 Cron 任务作为在 Engine Yard 上运行常规任务而不是使用发条的更好方法。

  1. 在您的环境底部单击 Crontabs(图片http://d.pr/i/3Yeo
  2. 通过给出作业名称添加作业,例如用于运行 rake 任务的命令: cd /data/APP_NAME/current && RAILS_ENV=production /usr/local/bin/bundle exec rake task_name
  3. 给它一个用户和时间间隔,然后按创建。
  4. 返回您的环境,按应用。

如果您想要在 Rails 中设置 cron 任务的更多 ruby​​ 方法,有一个很好的 gem,称为“无论何时”,它允许您在 ruby​​ 中编写 cron 任务,但它们会被写入 crontab。一个谷歌引擎场上的任何时候都会返回一些关于其他人如何去做的帖子,但是为了做像你展示的那样简单的事情,我上面的说明可能是最简单的。

于 2013-07-18T11:55:46.760 回答