【发布时间】:2013-11-21 04:58:04
【问题描述】:
我们正在尝试在 ubuntu 12.04 和 rails 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