在 Ruby 中,当我的主进程退出或被终止时,如何确保从我的程序派生的子进程不会继续运行?
最初我以为我可以在主进程中使用 at_exit
,但是如果我的主进程被 kill -9
ed 或调用 ,那将不起作用内核.exec
。我需要一个(基本上)万无一失且跨平台的解决方案。
最佳答案
如果您必须为您的父应用程序处理 kill -9 终止,那么您只有几个我能看到的选择:
- 创建工作队列管理器并从工作队列管理器中生成/终止子进程。如果您不能保证工作队列管理器也不会在没有警告的情况下被杀死,那么我认为选项 2 是您唯一的选择,因为您唯一确定的是子进程仍在运行。
- http://www.celeryproject.org/
- http://aws.amazon.com/elasticbeanstalk/
- 更激进的方法 - 基本上会产生整个操作系统实例,但它们肯定会在您的操作参数范围内被杀死
- 让子进程通过 RPC 检查来自父进程的“心跳”或监视内存中的父 PID 或查看/tmp 中保持事件文件的日期/时间以确保它是最新的。
- 如果子进程无法看到父进程正在执行其响应 RPC 消息、保留在内存中或使文件日期/时间保持最新的工作,则子进程必须自行终止。
关于ruby - 确保在父进程死亡时杀死孤立进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18218300/