【问题标题】:How to Detect in Sub Process When Parent Process Has Died?当父进程死亡时如何在子进程中检测?
【发布时间】:2011-04-18 16:02:52
【问题描述】:

在 python 中,我有一个父进程,它产生了一些子进程。我遇到了一种情况,由于未处理的异常,父进程正在死亡,而子进程则处于孤立状态。如何让子进程认识到他们失去了父进程?

我尝试了一些将子进程与每个可用信号挂钩的代码,但没有一个被触发。从理论上讲,我可以在父进程周围放置一个巨大的 try/except 以确保它至少向子进程触发一个 sigterm,但这是不优雅且不是万无一失的。如何防止孤立进程?

【问题讨论】:

  • “理论上,我可以在父进程周围放置一个巨大的 try/except ,以确保它至少向子进程触发一个 sigterm。”这基本上是我在某个项目中所做的。我希望你能得到一些更好的解决方案...
  • *.com/questions/759443/… 好像是同一个问题

标签: python subprocess orphan


【解决方案1】:

在 UNIX(包括 Linux)上:

def is_parent_running():
    try:
        os.kill(os.getppid(), 0)
        return True
    except OSError:
        return False

注意,在 UNIX 上,信号 0 不是真正的信号。它仅用于测试给定进程是否存在。 kill 命令见手册。

【讨论】:

    【解决方案2】:

    您可以在创建子进程之前使用socketpair() 创建一对unix 域套接字。让父母打开一端,让孩子打开另一端。当父级退出时,它的套接字将关闭。然后孩子会知道它退出了,因为它可以select()/poll() 从其套接字读取事件并在那时接收文件结尾。

    【讨论】:

    • 好主意。你可能也可以用管道做同样的事情
    • 这几乎就是我现在使用进程之间的管道所做的事情。由于代码的结构,它没有我想要的那么干净,但据我所知,它与我将得到的一样好。