2013-10-18 77 views
0

我在使用python中的子进程来启动一个程序。当它启动时它会保存在数据库中创建的进程的pid。一段时间后,如果触发器发生,它需要停止这个进程,开始一个新的。 问题是,当我使用subprocess.Popen()。pid它会返回一个僵尸进程的PID(已停用),而不是真正的进程,我需要停止。自启动进程命令和kill之后,我无法使用terminate命令命令发生在不同的脚本中。所以我需要一种方法来获得我开始的过程的真正pid,而不是僵尸进程的pid。在python中使用pid来杀死子进程

回答

0

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

如果您只需要停止该过程,那么请不要担心 - 它已停止。但是,你需要担心系统中有太多的僵尸(有些人甚至认为1太多),因为linux会为每个进程发出一个pid,并且其中太多会阻止你运行新的流程。

有一个强制父进程收割他们的子女的黑客here

+0

我只想得到正确的PID过程而不是僵尸的PID。我不认为我可以接受这个答案。无论如何谢谢。 – vkefallinos

+0

您拥有正确的pid。没有其他的PID。这个过程从一个pid开始,然后退出。该pid不会改变。你得到了正确的pid,但没有什么可以做到的,除了上述以外。 – micromoses

+0

也许[this](https://www.google.co.il/#q=what+is+a+zombie+process)会有所帮助。 – micromoses