2

daemons我正在尝试使用gem启动和停止无限循环守护程序。

查看主页,我尝试了(在 irb 中):

require 'daemons'
=>true
task_handle = Daemons.call do
  loop{
    sleep 10
    puts "foo"
  }
end
=> #<Daemons::Application:0x000000043f96d0 ...
task_handle.stop
=> nil
task_handle2 = Daemons.call do
  loop{
    sleep 10
    puts "bar"
  }
end

=>Daemons::RuntimeException: there is already one or more instance(s) of the program running
from /home/bdares/.rvm/gems/ruby-1.9.3-p194/gems/daemons-1.1.9/lib/daemons/application_group.rb:125:in `new_application'
from /home/bdares/.rvm/gems/ruby-1.9.3-p194/gems/daemons-1.1.9/lib/daemons.rb:251:in `call'
from (irb):21

现在,我正在查看的确切示例(链接页面上的#3)使用 option 进行第一次调用:multiple => true,但我真的只需要一次运行一个守护进程(事实上,多个守护进程是不可取的)。

第一个守护进程是否仍然存在并且没有被 GC 处理?如果是这样,我错过了什么?

4

2 回答 2

0

以下代码可以正常工作:

require 'daemons'
task_handle = Daemons.call(:force => true)  do
  loop{
    sleep 10
    puts "foo"
  }
end

task_handle.stop

task_handle2 = Daemons.call do
  loop{
    sleep 10
    puts "foo"
  }
end

变化在于第一次看涨:force期权。守护进程检查创建的应用程序编号,而不仅仅是它们正在运行。在您的情况下,即使停止后第一个实例仍然存在。“强制”选项清除未运行的应用程序。

请注意,您可能会遇到另一个问题 -task_handle.stop不能保证生成的 proc 会立即停止,因此您需要处理这种情况。

于 2012-09-14T07:17:11.433 回答
0

我认为这里的误解是守护进程没有按顺序运行。根据它们的性质,它们并行运行,它们之间几乎没有协调。我相信您可以找到 System V IPC 信号量的 Ruby 接口来协调它们,但是如果您想要一个作业队列,请查看除守护程序之外的其他东西。

此外,要添加到上面的@Sigurd 答案,这里是实现该:force选项的有问题的代码(方便地未记录)(source):

115: if @applications.size > 0 and not @multiple
116:         if options[:force]
117:           @applications.delete_if {|a|
118:             unless a.running?
119:               a.zap
120:               true
121:             end
122:           }
123:         end
124:         
125:         raise RuntimeException.new('there is already one or more instance(s) of the program running') unless @applications.empty?
126:       end

所以基本上, ( zap,正如我在源代码中发现的,绝对什么都不做),当你指定 时,如果没有设置多个:force,守护进程将删除所有非运行的应用程序。@applications否则,您会收到错误消息。因此,这意味着如果您不指定:forceor :multiple,那么您将单向出错。

注意:所有这一切的原因是Application#stop不会从ApplicationGroup(负责创建新作业的)中删除守护进程。

注意:顺便说一句,在 Ruby 中{}用于多行块是不好的形式。仅用于{}单行块。do...end改为用于多行。

于 2012-09-15T02:13:04.600 回答