Ruby守护进程,干净关闭

前端之家收集整理的这篇文章主要介绍了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

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

猜你在找的Ruby相关文章