【问题标题】:Why Ruby Daemons.run_proc block was skipped entirely on ubuntu 12.04为什么在 ubuntu 12.04 上完全跳过了 Ruby Daemons.run_proc 块
【发布时间】:2013-11-21 04:58:04
【问题描述】:

我们正在尝试在 ubuntu 12.04rails 3.2.12 环境中为 ruote worker 启动一个带有 gem daemons 的守护进程。这是 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() 块被完全跳过,根本没有执行。我们尝试了没有 'ruote_worker' 和 Daemons.call()Daemons.run_proc() 并且没有执行块内的任何代码。不知何故,整个块被跳过并且永远不会被执行。有人可以阐明如何使守护程序工作吗?我们对 ruby​​ daemons gem 的经验有限(欢迎详细说明)。谢谢。

【问题讨论】:

  • 守护进程时需要注意的重要事项: 1) 文件句柄(例如用于日志记录)将在守护进程中关闭。所以你需要在run_proc 中重新创建你的记录器。 2)$stdin$stdout$stderr将重新打开指向/dev/null。 3) Process.pid 在守护进程中会有不同的值。由于 #1,守护程序实际上可能正在运行,但您不会看到日志消息。

标签: ruby-on-rails ruby ubuntu daemon ruby-daemons


【解决方案1】:

阅读http://daemons.rubyforge.org/,了解如何使用守护进程 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 中的脚本。

【讨论】:

  • 这有助于我使用对我不起作用的“ruby daemon.rb start”。根据您的回答,我尝试了“ruby daemon.rb run”,这让我更进一步,但是在创建“amine.log”时出现权限错误,因为它试图在顶级文件夹“/”下创建,我该如何配置控制目录和记录器名称的选项(即 amine.log)
  • 我建议在实例化记录器时使用绝对路径,例如logger = Logger.new(File.join File.dirname(__FILE__), 'amine.log') 在与当前脚本相同的目录中创建日志文件...
  • 关于“ruby daemon.rb run”与“ruby daemon.rb start”:使用run将在前台运行守护进程(有利于调试),使用 start 将正确地守护进程...所以只要使用 run 一切正常,您就必须使用开始真正使用守护进程时...
  • 谢谢。还有一件事,如何控制pid文件的目录
  • 您可以使用:dir:dir_mode 选项来做到这一点。详情请见daemons.rubyforge.org/Daemons.html#run-method
猜你喜欢
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 2014-01-07
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多