【发布时间】:2010-08-11 11:45:35
【问题描述】:
当不同的机器有不同的工作要做时,在 Rails 上运行 cron 工作的最佳方式是什么?
例如,服务器 1 运行 cron 作业 A,而服务器 2 运行 cron 作业 B
当我们进行常规 cap 部署时,有没有办法同时部署 cron 文件?
【问题讨论】:
标签: ruby-on-rails ruby cron
当不同的机器有不同的工作要做时,在 Rails 上运行 cron 工作的最佳方式是什么?
例如,服务器 1 运行 cron 作业 A,而服务器 2 运行 cron 作业 B
当我们进行常规 cap 部署时,有没有办法同时部署 cron 文件?
【问题讨论】:
标签: ruby-on-rails ruby cron
看一下when 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
您的日程安排会运行,但随后会包含任何本地内容,只需确保在上面的 cap 任务运行之前对其进行符号链接,您应该一切顺利。
我希望这会有所帮助!
【讨论】: