【问题标题】:Ensure orphaned processes are killed when the parent process dies确保在父进程死亡时杀死孤立进程
【发布时间】:2013-08-13 20:08:25
【问题描述】:

在 Ruby 中,当我的主进程退出或被杀死时,如何确保从我的程序生成的子进程不会继续运行?

最初我以为我可以在主进程中使用at_exit,但如果我的主进程得到kill -9ed 或调用Kernel.exec,这将不起作用。我需要一个(基本上)万无一失且跨平台的解决方案。

【问题讨论】:

  • 你是如何启动有问题的子进程的?例如,它是一个Open4.open4 块吗?
  • 请注意,如果您的主进程是kill -9ed,那么您在代码中几乎无能为力。运行kill 9 的人已经决定,整理是他们的问题。
  • @NeilSlater 我正在使用一个库 (childprocess),它根据平台使用不同的方法来启动子进程。

标签: ruby ruby-1.9 ruby-1.9.3


【解决方案1】:

如果你必须为你的父应用处理 kill -9 终止,那么我可以看到你只有几个选择:

  • 创建工作队列管理器并从工作队列管理器生成/终止子进程。如果您不能保证工作队列管理器也不会在没有警告的情况下被杀死,那么我认为选项 2 是您唯一的选择,因为您唯一确定的是子进程仍在运行。
  • 让子进程通过 RPC 或监视内存中的父 PID 或查看 /tmp 中保持活动文件的日期/时间来检查父进程的“心跳”,以确保它是最新的。
    • 如果子进程无法看到父进程正在执行它的工作,即响应 RPC 消息、留在内存中或保持文件日期/时间为最新,则子进程必须自行终止。

【讨论】:

  • 感谢您的回答。我基本上最终选择了选项 2,除了子进程直接检查父进程的心跳,我生成了一个单独的进程来处理它。