我正在尝试在多个守护进程中运行相同的脚本。
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
中的一个错误,守护进程崩溃,监视器重新启动只有一个而不是全部。所以我最终得到了一个正在运行的守护进程。
为什么呢?我做错了什么?
答案 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
...
这会稍微改变您的启动代码,但是现在您将对每个守护进程都有一个监视进程。