【问题标题】:Kill subprocess in python using pid [duplicate]使用pid杀死python中的子进程[重复]
【发布时间】:2013-10-27 09:38:16
【问题描述】:

我在python中使用子进程来启动一个程序。当它启动时,它会保存在数据库中创建的进程的pid。一段时间后,如果发生触发器,它需要停止这个进程并启动一个新进程。 问题是当我使用 subprocess.Popen().pid 它返回僵尸进程(已失效)的 pid 而不是我需要停止的真实进程。我不能使用终止命令,因为启动进程命令和 kill 命令发生在不同的脚本中。所以我需要一种方法来获取我正在启动的进程的真实 pid,而不是僵尸进程的 pid。

【问题讨论】:

    标签: python linux subprocess pid


    【解决方案1】:

    僵尸进程是一个死进程,它的数据仍然由操作系统保存以返回给调用进程(退出值等)。你不能杀死一个僵尸进程,因为它已经死了。有两种方法可以摆脱它;在父进程退出之前使用Popen.wait() 来自其父进程的子进程或在后台使用Popen.poll() 如果父进程应该继续运行,或者杀死所有父进程直到僵尸的父进程为1 init,init 将自动收割它.然后,您应该更新您的进程退出的数据库,因为 linux 可能会将相同的 pid 提供给一个新的不相关进程(您最终可能会杀死一个您不打算杀死的进程)。

    如果您只需要停止该过程,请不要担心 - 它已经停止了。但是,您确实需要担心系统中的僵尸过多(有人说即使是 1 也太多了),因为 linux 会为每个进程发出一个 pid,而这些僵尸过多可能会阻止您运行新进程进程。

    有一种 hack 可以强制父进程获取其子进程 here

    【讨论】:

    • 我只是想得到进程的正确 pid 而不是僵尸的 pid。我想我不能接受这个答案。还是谢谢你。
    • 您的 pid 正确。没有其他pid。该进程以 pid 开始,然后退出。 pid 不会改变。你得到了正确的 pid,但除了上述之外,你无能为力。
    • 也许this 会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2013-11-12
    • 2018-12-14
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 2010-12-08
    相关资源
    最近更新 更多