Запуск заданий cron на рельсах (развернуто на нескольких серверах) - PullRequest
1 голос
/ 11 августа 2010

Каков наилучший способ запуска заданий cron на рельсах, когда разные машины выполняют разные задания?

Например, сервер 1 запускает задание cron A, а сервер 2 запускает задание cron B

Есть ли способ развернуть файлы cron, когда мы выполняем обычное cap-развертывание?

1 Ответ

5 голосов
/ 11 августа 2010

взгляните на камень всякий раз, http://github.com/javan/whenever

Отлично подходит для автоматизации задач cron с помощью rails с четким DSL. Мы используем его для производства уже несколько месяцев, и он просто работает и очень легкий. Некоторые примеры из их README:

 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

README очень тщательный, но есть также хороший скринкаст на железнодорожных передачах: 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, и вы должны быть в порядке.

Надеюсь, это поможет!

...