当不同的计算机有不同的工作要做时,在rails上运行cron作业的最佳方法是什么?
例如,服务器1运行cron作业A,而服务器2运行cron作业B
当我们进行常规上限部署时,有没有办法部署cron文件?
答案 0 :(得分:5)
看看每当gem 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
自述文件非常全面,但有关于railscasts的屏幕录像也很好: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
就机器而言,您可以在部署时使用本地配置文件甚至符号链接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
您的日程安排会运行,但随后会包含任何本地日程,只需确保在上面的上限任务运行之前符号链接,您应该好好去。
我希望这有帮助!