Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 rufus调度程序在Rails+;分离模式下的独角兽_Ruby On Rails 4_Unicorn_Rufus Scheduler - Fatal编程技术网

Ruby on rails 4 rufus调度程序在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 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 '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