Ruby on rails 4 rufus调度程序在Rails+;分离模式下的独角兽
我正在使用Ruby on Rails应用程序安排一些作业。相关规格:Ruby on rails 4 rufus调度程序在Rails+;分离模式下的独角兽,ruby-on-rails-4,unicorn,rufus-scheduler,Ruby On Rails 4,Unicorn,Rufus Scheduler,我正在使用Ruby on Rails应用程序安排一些作业。相关规格: Ruby:2.1.2p95 轨道:4.1.1 Rufus调度程序:3.0.9 当我使用“rails s unicorn”运行应用程序时,调度程序运行得非常好。但是,当我使用“-d”选项分离服务器时,计划的作业永远不会运行 这是我的config/initializers/task_scheduler.rb文件: require 'rubygems' require 'rufus/scheduler' require 'rak
- Ruby:2.1.2p95
- 轨道:4.1.1
- Rufus调度程序:3.0.9
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文件:
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
“!MyApplication.rake?”行用于防止rake任务也运行调度程序;我已将这一行添加到我的Rakefile中:
MyApplication.rake = true
当我查看日志时,我注意到正在打印“OK”行,因此我相信调度程序正在正确初始化,但作业的日志行从未打印,并且rake任务也没有运行
此时,我不确定问题是出在我的unicorn配置中,还是出在我的调度程序配置中。任何帮助都将不胜感激
编辑1:
“rails s”的日志输出
“rails s-d”的日志输出
正如jmettraux所建议的,当使用“-d”选项时,调度程序似乎在fork之后丢失了。我稍微改变了一下,将调度程序移动到一个类中,并从after_fork块调用了初始值设定项:
lib/scheduler.rb
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:
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
然而,当启动“rails s-d”时,这会失去控制,工人们不断地被繁殖和杀害:
Before
Before
After
After
startup
startup
Before
After
Before
startup
After
startup
Before
After
startup
我确信从after_fork块启动调度器的实现可能是原因,但我不确定到底是什么导致了这一问题
编辑2
我很笨。我使用的是jmettraux链接的,但当我试图让它在我的应用程序中工作时,我破坏了它。我回去,从零开始启动了我的unicorn.rb和scheduler.rb,现在它可以工作了 您应该在after_fork块中添加一些Rails.logger.info(“XXX”),以查看它是发生在OK之前还是之后 似乎有人也有同样的问题,并想出了一些办法: 它已经四年了,但它可以给你一些灵感
它的“要点”似乎是在after_fork块中运行/启动rufus调度程序(这样它的线程就不会在fork中被杀死)。伙计!我承认,我之前看过这篇文章,但我没有花时间去理解发生了什么。谢谢你让我一直走在正确的道路上,现在工作起来很有魅力@BrianSmith,我可以知道你在上面的脚本中到底做了什么改变来让它工作吗?因为,我面临着类似的问题。@elixir这里是更新了scheduler.rb和unicorn.rb文件的要点@我终于用同样的剧本完成了。但是非常感谢。我会调查的
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
Before
Before
After
After
startup
startup
Before
After
Before
startup
After
startup
Before
After
startup