[ruby-on-rails] 레일을위한 크론 작업 : 모범 사례?

Rails 환경에서 예약 된 작업을 실행하는 가장 좋은 방법은 무엇입니까? 스크립트 / 러너? 갈퀴? 몇 분마다 작업을 실행하고 싶습니다.



답변

레이크 접근 방식을 사용하고 있습니다 ( heroku 지원 )

lib / tasks / cron.rake 파일이 있습니다.

task :cron => :environment do
  puts "Pulling new requests..."
  EdiListener.process_new_messages
  puts "done."
end

명령 행에서 실행하려면 “rake cron”입니다. 그런 다음이 명령을 원하는대로 운영 체제 cron / 작업 스케줄러에 넣을 수 있습니다.

이것은 오래된 질문과 답변입니다 업데이트 ! 몇 가지 새로운 정보 :

  • 내가 참조한 heroku cron 서비스는 이후 Heroku Scheduler 로 대체되었습니다.
  • 빈번한 작업 (특히 Rails 환경 시작 비용을 피하려는 경우)에서 선호하는 접근 방식은 시스템 크론을 사용하여 (a) 백그라운드에서 필요한 작업을 호출하기 위해 보안 / 개인 웹 후크 API를 찌르는 스크립트를 호출하는 것입니다. 또는 (b) 선택한 대기열 시스템에서 작업을 직접 대기열에 추가

답변

나는 예약 된 작업에 크게 의존하는 프로젝트를 할 때마다 매우 인기가 많았 습니다. crontab 형식을 처리하지 않고 예약 된 작업을 정의 할 수있는 훌륭한 DSL을 제공합니다. 읽어보기에서 :

cron 작업을 작성하고 배포하기위한 명확한 구문을 제공하는 Ruby gem 일 때마다.

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


답변

프로젝트에서 우리는 보석을 사용할 때마다 처음 사용했지만 몇 가지 문제에 직면했습니다.

그런 다음 RUFUS SCHEDULER gem으로 전환하여 Rails에서 작업을 예약하는 데 매우 쉽고 신뢰할 수있는 것으로 나타났습니다.

우리는 매주 및 매일 메일을 보내거나주기적인 레이크 작업이나 방법을 실행하는 데 사용했습니다.

이것에 사용되는 코드는 다음과 같습니다

    require 'rufus-scheduler'

    scheduler = Rufus::Scheduler.new

    scheduler.in '10d' do
      # do something in 10 days
    end

    scheduler.at '2030/12/12 23:30:00' do
      # do something at a given point in time
    end

    scheduler.every '3h' do
      # do something every 3 hours
    end

    scheduler.cron '5 0 * * *' do
      # do something every day, five minutes after midnight
      # (see "man 5 crontab" in your terminal)
    end

자세한 내용은 https://github.com/jmettraux/rufus-scheduler


답변

작업을 완료하는 데 시간이 오래 걸리지 않는다고 가정하면 각 작업에 대한 작업으로 새 컨트롤러를 만드십시오. 태스크의 논리를 컨트롤러 코드로 구현 한 다음 wget을 사용하여이 컨트롤러의 URL을 호출하고 적절한 시간 간격으로 조치를 수행하는 OS 레벨에서 cronjob을 설정하십시오. 이 방법의 장점은 다음과 같습니다.

  1. 일반 컨트롤러처럼 모든 Rails 객체에 완전히 액세스 할 수 있습니다.
  2. 정상적인 행동을하는 것처럼 개발하고 테스트 할 수 있습니다.
  3. 간단한 웹 페이지에서 작업 adhoc을 호출 할 수도 있습니다.
  4. 추가 루비 / 레일 프로세스를 실행하여 더 이상 메모리를 사용하지 마십시오.

답변

스크립트 / 러너 및 레이크 작업은 크론 작업으로 실행하기에 완벽합니다.

cron 작업을 실행할 때 반드시 기억해야 할 중요한 사항이 있습니다. 아마도 앱의 루트 디렉토리에서 호출되지 않을 것입니다. 즉, 파일에 대한 모든 요구 사항 (라이브러리와 달리)은 명시 적 경로 (예 : File.dirname (__ FILE__) + “/ other_file”)를 사용하여 수행해야합니다. 이것은 또한 다른 디렉토리에서 명시 적으로 호출하는 방법을 알아야한다는 것을 의미합니다 🙂

코드가 다른 디렉토리에서 실행될 수 있는지 확인하십시오.

# from ~
/path/to/ruby /path/to/app/script/runner -e development "MyClass.class_method"
/path/to/ruby /path/to/rake -f /path/to/app/Rakefile rake:task RAILS_ENV=development

또한 크론 작업은 아마도 실행되지 않을 것이므로 .bashrc에 넣은 바로 가기에 의존하지 마십시오. 그러나 그것은 단지 표준 cron 팁입니다 😉


답변

언제나 (그리고 cron)의 문제는 그것이 실행될 때마다 레일 환경을 다시로드한다는 것입니다. 이것은 작업이 빈번하거나 초기화 작업이 많이 필요한 실제 문제입니다. 이로 인해 생산에 문제가 있었고 경고해야합니다.

Rufus 스케줄러가 나를 위해합니다 ( https://github.com/jmettraux/rufus-scheduler )

실행할 작업이 길면 delayed_job ( https://github.com/collectiveidea/delayed_job ) 과 함께 사용합니다.

이게 도움이 되길 바란다!


답변

나는 resque / resque 스케줄러 의 큰 팬입니다 . cron과 유사한 반복 작업뿐만 아니라 특정 시간에 작업도 실행할 수 있습니다. 단점은 Redis 서버가 필요하다는 것입니다.