在rails上运行cron作业(部署在多个服务器上)

min*_*eow 1 ruby cron ruby-on-rails

当不同的机器有不同的工作要做时,在轨道上运行cron作业的最佳方法是什么?

例如,服务器1运行cron作业A,而服务器2运行cron作业B.

有没有办法在我们进行常规上限部署时部署cron文件?

Geo*_*tte 5

看看随时随地的宝石,http://github.com/javan/whenever

它非常适合使用具有清晰DSL的rails自动执行cron任务.我们已经使用它生产了几个月,它只是工作,非常轻量级.其自述文件中的一些示例:

 every 3.hours do
    runner "MyModel.some_process"
    rake "my:rake:task"
    command "/usr/bin/my_great_command"
  end

  every 1.day, :at => '4:30 am' do
    runner "MyModel.task_to_run_at_four_thirty_in_the_morning"
  end

  every :hour do # Many shortcuts available: :hour, :day, :month, :year, :reboot
    runner "SomeModel.ladeeda"
  end

  every :sunday, :at => '12pm' do # Use any day of the week or :weekend, :weekday
    runner "Task.do_something_great"
  end
Run Code Online (Sandbox Code Playgroud)

自述文件非常全面,但有关于railscast的屏幕播放也很好:http: //railscasts.com/episodes/164-cron-in-ruby

它可以轻松地与capistrano集成以下代码(从README复制):

  after "deploy:symlink", "deploy:update_crontab"

  namespace :deploy do
    desc "Update the crontab file"
    task :update_crontab, :roles => :db do
      run "cd #{release_path} && whenever --update-crontab #{application}"
    end
  end
Run Code Online (Sandbox Code Playgroud)

就机器特定而言,您可以使用本地配置文件,甚至可以config/schedule.rb在部署时对文件进行符号链接.我想我会包含一个本地文件,该文件将在部署时进行符号链接local_schedule.rb,然后将其置于顶部config/schedule.rb

if File.exists?(File.dirname(__FILE__) + '/config/local_schedule.rb')
  require File.dirname(__FILE__) + '/local_schedule.rb'
end
Run Code Online (Sandbox Code Playgroud)

你的日程安排会运行,但随后包含任何本地的日程安排,只需确保在上面的上限任务运行之前符号链接,你应该好好去.

我希望这有帮助!