守护进程没有重启?

时间:2013-01-25 04:16:14

标签: ruby daemons

我正在尝试在多个守护进程中运行相同的脚本。

myapp.rb看起来像这样:

loop do
  sleep 5
  1 / 0 # crash it
end

我的myapp_controller.rb

require 'rubygems'
require 'daemons'

options = {
  :log_output  => true,
  :backtrace   => true,
  :monitor     => true,
  :multiple    => true,
  :log_dir     => '/mnt/log/',
  :hard_exit   => true
}
Daemons.run(File.join(File.dirname(__FILE__), 'myapp.rb'), options)

当我连续多次运行ruby myapp_controller.rb start时,它会像我期望的那样创建许多守护进程。但是,过了一段时间,由于myapp.rb中的一个错误,守护进程崩溃,监视器重新启动只有一个而不是全部。所以我最终得到了一个正在运行的守护进程。

为什么呢?我做错了什么?

2 个答案:

答案 0 :(得分:4)

我能够重现这种行为。这不是你做错了什么;它是daemons gem表现的方式。

通过code for the daemons gem:multiple选项与:monitor选项不兼容。

:monitor选项仅在守护程序以单一模式运行时才有效。

我创建了一个bug report on the daemons project page引用此问题作为来源。

有关问题复制的更多信息:

:multiple => true时会创建多个守护程序进程。每个进程都有自己的pid文件,格式为<scriptname>.rb<number>.pid

但是,只创建了一个监视器进程(使用单个<scriptname>.rb_monitor.pid文件。)

以下是我开始守护进程3次时启动的进程列表:

$ ps -fe | grep my_server
  501  1758     1   0 12:25PM ??         0:00.63 my_server.rb  
  501  1759     1   0 12:25PM ??         0:00.43 my_server.rb_monitor  
  501  1764     1   0 12:25PM ??         0:00.54 my_server.rb  
  501  1834     1   0 12:51PM ??         0:00.31 my_server.rb 

pid / log文件夹中的文件:

$ ls /tmp/daemons-2013-01-25/
my_server.rb.log                my_server.rb1.pid               my_server.rb_monitor.pid
my_server.rb0.pid               my_server.rb2.pid

答案 1 :(得分:0)

the issue被解决之前,您可以将代码更改为以下形式:

#myapp_controller.rb
require 'rubygems'
require 'daemons'

number = ARGV.fetch(1)

options = {
  :app_name    => "daemon-#{number}" # provide app_name
  :log_output  => true,
  :backtrace   => true,
  :monitor     => true,
  :multiple    => false, # disable multiple option
  :log_dir     => '/mnt/log/',
  :hard_exit   => true
}
Daemons.run(File.join(File.dirname(__FILE__), 'myapp.rb'), options)

然后使用以下命令启动守护程序:

ruby myapp_controller.rb start 1
ruby myapp_controller.rb start 2
...

这会稍微改变您的启动代码,但是现在您将对每个守护进程都有一个监视进程。

相关问题