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를 처음부터 시작했는데 이제는 작동 중입니다!
내 남자! 나는이 기사를 더 일찍 보았지만 일어난 일을 이해할 시간을 가지지 않았다. 올바른 길로 나를 지켜 주셔서 감사합니다, 지금 매력처럼 작동합니다! –
@BrianSmith, 정확히 작동하도록 위의 스크립트에서 무엇을 변경했는지 알 수 있습니까? 왜냐하면, 비슷한 문제에 직면하고 있기 때문입니다. – elixir
@elixir 다음은 업데이트 된 scheduler.rb 및 unicorn.rb 파일이있는 요지입니다. https://gist.github.com/anonymous/5b611d395a7c4f2621c6745db7da4e28 –