加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby守护进程,干净关闭

发布时间:2020-12-17 04:21:30 所属栏目:百科 来源:网络整理
导读:我想创建一个 ruby守护进程,它可以使用kill命令正常关闭. 我想添加一个信号陷阱,等到#code可能需要一些时间来运行完成才能关闭.我如何将其添加到以下内容中: pid = fork do pid_file = "/tmp/pids/daemon6.pid" File.open(pid,'w'){ |f| f.write(Process.pi
我想创建一个 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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读