【问题标题】:Daemons do not get restarted?守护进程不会重新启动?
【发布时间】:2013-01-09 00:43:03
【问题描述】:

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

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

为什么?我做错了什么?

【问题讨论】:

    标签: ruby daemons


    【解决方案1】:

    我能够重现该行为。这不是你做错了什么;这是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
    

    【讨论】:

    【解决方案2】:

    在解决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
    ...
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-28
      • 2013-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多