3

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

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守护进程中的错误崩溃并且监视器仅重新启动一个而不是全部。所以我最终得到了一个正在运行的守护进程。

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

4

2 回答 2

4

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

查看守护程序 gem的代码,结果发现该:multiple选项不适用于该:monitor选项。

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

在守护进程项目页面上创建了一个错误报告,引用这个问题作为源。

有关问题重现的更多信息:

时会创建多个守护进程: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
于 2013-01-25T09:22:45.480 回答
0

问题解决之前,您可以将代码更改为以下内容:

#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
...

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

于 2018-11-11T17:18:05.677 回答