Ruby 守护进程不能重新启动吗?

Ruby 守护进程不能重新启动吗?,ruby,daemons,Ruby,Daemons,我正在尝试在多个守护进程中运行相同的脚本 myapp.rb如下所示: loop do sleep 5 1 / 0 # crash it end #myapp_controller.rb require 'rubygems' require 'daemons' number = ARGV.fetch(1) options = { :app_name => "daemon-#{number}" # provide app_name :log_output =>

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

myapp.rb
如下所示:

loop do
  sleep 5
  1 / 0 # crash it
end
#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)
my
myapp\u控制器.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
中的错误,守护进程崩溃,监视器只重新启动一个而不是全部。因此,我最终只有一个运行的守护进程


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

我能够重现这种行为。这不是你做错了什么;这是
守护进程gem
的行为方式

查看后,发现
:multiple
选项与
:monitor
选项不匹配

只有当守护进程在单一模式下运行时,
:monitor
选项才起作用。

我创建了一个引用此问题作为源的示例

有关本期再版的更多信息: 当
:Multiple=>true
时,会创建多个守护进程。每个进程都有自己的pid文件,格式为
.rb.pid

但是,只创建一个监视进程(使用单个
.rb\u 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
在解决问题之前,您可以将代码更改为以下内容:

loop do
  sleep 5
  1 / 0 # crash it
end
#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
...

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

文章中给出的错误报告似乎是一个断开的链接。这是github上的一个问题页面。