2015-01-29 3 views
2

Ruby on Rails 애플리케이션에서 일부 작업을 예약하기 위해 rufus-scheduler을 사용하고 있습니다. 관련 사양 :rufus-scheduler가 분리 모드에서 Rails + Unicorn을 실행할 때 스케줄링하지 않음

  • 루비 : 2.1.2p95
  • 레일 : 4.1.1
  • 루퍼스 - 스케줄러 : 3.0.9

내가 사용하는 응용 프로그램을 실행할 때 스케줄러가 완벽하게 잘 실행 " 레일 s 유니콘 ". 그러나 "-d"옵션을 사용하여 서버를 분리하면 예약 된 작업이 실행되지 않습니다.

require 'rubygems' 
require 'rufus/scheduler' 
require 'rake' 

load File.join(Rails.root, 'lib', 'tasks', 'send_emails.rake') 
MyApplication::Application.load_tasks 
scheduler = Rufus::Scheduler.new(:lockfile => ".rufus-scheduler.lock") 

if (!MyApplication.rake?) 
    unless scheduler.down? 

    Rails.logger.info "OK" 

    scheduler.interval("1m") do 
     Rails.logger.info "yup" 
     system ("rake send_emails:mail_users") 
    end 

    end 
end 

내 unicorn.rb 파일 : 여기

내 설정/초기화/task_scheduler.rb 파일입니다 "!? MyApplication.rake"

worker_processes 2 
preload_app true 
timeout 30 

before_fork do |server, worker| 
    Signal.trap 'TERM' do 
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead' 
    Process.kill 'QUIT', Process.pid 
    end 

    defined?(ActiveRecord::Base) and 
    ActiveRecord::Base.connection.disconnect! 
end 

after_fork do |server, worker| 
    Signal.trap 'TERM' do 
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT' 
    end 

    defined?(ActiveRecord::Base) and 
    ActiveRecord::Base.establish_connection 
end 

라인은 레이크 태스크가 스케줄러를 실행하지 못하게하는 것입니다. 내 Rakefile이 라인을 추가했습니다 :

MyApplication.rake = true 

내 로그를 볼 때 나는 "OK"라인이 인쇄되는 것을 알 수 그래서 스케줄러가 제대로 초기화 믿지만에 대한 로거 라인 작업이 인쇄되지 않고 레이크 작업이 실행되지 않습니다.

문제가 유니콘 구성 또는 스케쥴러 구성에 있는지 여부는 확실하지 않습니다. 어떤 도움이라도 대단히 감사하겠습니다!

편집 1 : "레일의 -d"

OK 
Before 
Before 
After 
After 

jmettraux가 제안한 것처럼에서 "레일의"

I, [2015-01-28T20:11:05.179505 #79141] INFO -- : listening on addr=0.0.0.0:3000 fd=12 
Before 
Before 
I, [2015-01-28T20:11:05.426386 #79141] INFO -- : master process ready 
After 
After 
I, [2015-01-28T20:11:05.434392 #79143] INFO -- : worker=0 ready 
I, [2015-01-28T20:11:05.435585 #79144] INFO -- : worker=1 ready 
yup 

로그 출력에서 ​​

로그 출력은 스케줄러가 나타납니다 "-d"옵션을 사용할 때 포크 후에 잃어 버리게됩니다. 나는이 클래스로 스케줄러를 이동 약간의 물건을 전환하고 after_fork 블록에서 초기화라는 :

worker_processes 2 
preload_app true 
timeout 100 

load File.join(Rails.root, 'lib', 'scheduler.rb') 

... 

after_fork do |server, worker| 
    Rails.logger.info "After" 
    Signal.trap 'TERM' do 
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT' 
    end 

    defined?(ActiveRecord::Base) and 
    ActiveRecord::Base.establish_connection 

    Scheduler::startup 

end 

그러나 :

require 'rufus/scheduler' 
class Scheduler 

    def self.startup 
    Rails.logger.info "startup" 
    load File.join(Rails.root, 'lib', 'tasks', 'send_emails.rake') 
    USA::Application.load_tasks 
    scheduler = Rufus::Scheduler.new(:lockfile => ".rufus-scheduler.lock") 

    if (!USA.rake?) 
     Rails.logger.info "nope" 
     unless scheduler.down? 
     Rails.logger.info "OK" 

     scheduler.interval("1m") do 
      Rails.logger.info "yup" 
      system ("rake send_emails:mail_users") 
     end 

     scheduler.join 

     end 
    end 
    end 

end 

unicorn.rb이

lib 디렉토리/scheduler.rb을 , "rails s -d"를 시작할 때 이것은 통제 불능 상태가되며 작업자는 끊임없이 산란되고 죽습니다.

Before 
Before 
After 
After 
startup 
startup 
Before 
After 
Before 
startup 
After 
startup 
Before 
After 
startup 

after_fork 블록에서 스케쥴러를 시작하는 방법이 잘못되었다고 확신하지만,이 문제의 원인을 정확히 알 수는 없습니다. 2

편집은 나는 바보입니다.난 gist jmettraux 링크를 사용하고 있었지만, 내가 그것을 내 응용 프로그램에서 작동 시키려고 할 때 그것을 도살했다. 나는 돌아가서 unicorn.rb와 scheduler.rb를 처음부터 시작했는데 이제는 작동 중입니다!

답변

2

after_fork 블록에 Rails.logger.info ("XXX")를 추가하여 OK 이전이나 이후에 발생하는지 확인해야합니다.

누군가가 똑같은 문제를 가지고 뭔가를 생각해 냈습니다. https://gist.github.com/jkraemer/3851917 네 살이지만 영감을 줄 수 있습니다.

"요점"은 after_fork 블록에서 rufus-scheduler를 실행/시작하는 것으로 보인다 (스레드가 포크에서 종료되지 않도록).

+1

내 남자! 나는이 기사를 더 일찍 보았지만 일어난 일을 이해할 시간을 가지지 않았다. 올바른 길로 나를 지켜 주셔서 감사합니다, 지금 매력처럼 작동합니다! –

+1

@BrianSmith, 정확히 작동하도록 위의 스크립트에서 무엇을 변경했는지 알 수 있습니까? 왜냐하면, 비슷한 문제에 직면하고 있기 때문입니다. – elixir

+2

@elixir 다음은 업데이트 된 scheduler.rb 및 unicorn.rb 파일이있는 요지입니다. https://gist.github.com/anonymous/5b611d395a7c4f2621c6745db7da4e28 –