Ruby守护进程,干净关闭

我想创建一个 ruby守护进程,它可以使用kill命令正常关闭.
我想添加一个信号陷阱,等到#code可能需要一些时间来运行完成才能关闭.我如何将其添加到以下内容中:
pid = fork do
   pid_file = "/tmp/pids/daemon6.pid"
   File.open(pid,'w'){ |f| f.write(Process.pid) }
   loop do
      begin
         #code that could take some time to run
      rescue Exception => e
         Notifier.deliver_daemon_rescued_notification(e)
      end
      sleep(10)
   end
end
Process.detach pid

另外,将它放在一个单独的脚本中会更好吗,比如单独的kill脚本而不是将它作为守护程序代码的一部分?像monit或上帝会要求阻止它的东西?

我很感激任何建议.

解决方法

你可以像这样抓住中断:
pid = fork do
  begin
    loop do
      # do your thing
      sleep(10)
    end
  rescue Interrupt => e
    # clean up
  end
end
Process.detach(pid)

您可以对Signal.trap(‘INT’){…}执行相同的操作,但是如果涉及睡眠,我认为捕获异常会更容易.

更新:这是一种更传统的方式,它确保循环始终在停止之前完成:

pid = fork do
  stop = false
  Signal.trap('INT') { stop = true }
  until stop
    # do your thing
    sleep(10)
  end
end

不利的一面是,它总是会进入睡眠状态,所以几乎总会有一个延迟,直到你杀死它后该过程停止.你可以通过突然睡觉,或者做各种变体的组合来解决这个问题(在睡眠中拯救中断或其他东西).

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...