0

我们正在尝试为 ruote worker启动一个带有gem daemonsonubuntu 12.04和environment 的守护进程。rails 3.2.12这是 daemon.rb ( gem version 1.1.9):

#!/usr/bin/env ruby
require 'daemons'
require 'logger'
  root = Dir.pwd
  Dir.chdir(root)
  file = Dir.pwd + '/ruote_worker.rb' 
  options = {
    :dir_mode   => :normal,
    :dir        => File.join(root, 'amine.log'),
    :log_output => true,
    :backtrace  => true,
    :multiple   => false
  }

  logger = Logger.new('foo.log')
  logger.info('----before daemon----') 

  Daemons.run_proc('ruote_worker', options) do
    # Server loop:
    loop {
      puts '111111111111111'
      logger.info('aaaaaaaaaaaaaaa')
    }
  end

这是 foo.log:

# Logfile created on 2013-11-10 12:56:12 -0600 by logger.rb/36483
I, [2013-11-10T12:56:12.594196 #26557]  INFO -- : ----before daemon----

这是 ruote_worker.rb (用于测试目的):

#!/usr/bin/env ruby

require 'logger'
logger = Logger.new('amine.log')

loop do
    logger.info('---amine---')
    puts '*****************************************************  Amine ****************************'
    sleep 5
end

如日志所示,该Daemons.run_proc()块被完全跳过并且根本没有执行。我们尝试Daemons.run_proc()不使用“ruote_worker”,Daemons.call()并且块内的任何代码都没有被执行。不知何故,整个块被跳过并且永远不会被执行。有人可以阐明如何使守护程序工作吗?我们对 ruby​​ daemons gem 的经验有限(欢迎详细说明)。谢谢。

4

1 回答 1

2

阅读http://daemons.rubyforge.org/以获得关于如何使用daemons gem 的很好的介绍。基本上,有两种不同的方式来创建一个守护进程:

  • 要么你有一个控制脚本,包括一个Daemons.run_proc你实现守护进程行为的调用
  • 或者您有一个控制脚本,其中包含一个Daemons.run调用,您将另一个包含守护进程实现的脚本的名称传递给该调用

从您已经拥有的外观来看,您正试图选择第二个变体。以下对我有用:

# this is daemon.rb
require 'daemons'
Daemons.run('ruote_worker.rb')


# this is ruote_worker.rb
require 'logger'
logger = Logger.new('amine.log')
loop do
  logger.info('--- amine ---')
  puts '*** amine ***'
  sleep 5
end

当您现在调用ruby daemon.rb run(或ruby daemon.rb start)时,将启动一个守护进程并执行 ruote_worker.rb 中的脚本。

于 2013-11-18T08:46:43.413 回答