【问题标题】:Run cron jobs on rails (deployed over several servers)在 Rails 上运行 cron 作业(部署在多个服务器上)
【发布时间】:2010-08-11 11:45:35
【问题描述】:

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

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

当我们进行常规 cap 部署时,有没有办法同时部署 cron 文件?

【问题讨论】:

    标签: ruby-on-rails ruby cron


    【解决方案1】:

    看一下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 任务运行之前对其进行符号链接,您应该一切顺利。

    我希望这会有所帮助!

    【讨论】:

    • 我喜欢你的回答和 railscast,谢谢!我唯一的讽刺是做机器特定的东西的方法有点太复杂了。由于 Schedule.rb 允许我们编写 ruby​​ 代码,我想知道是否有办法在那里指定它。我在这里问了一个相关的问题:*.com/questions/3550770/…我有意义吗?
    最近更新 更多