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)
mymyapp\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上的一个问题页面。