我在python中使用子进程来启动一个程序。当它启动时,它会保存在数据库中创建的进程的pid。一段时间后,如果发生触发器,它需要停止这个进程并启动一个新进程。问题是当我使用 subprocess.Popen().pid 它返回僵尸进程(已失效)的 pid 而不是我需要停止的真实进程。我不能使用终止命令,因为启动进程命令和 kill 命令发生在不同的脚本中。所以我需要一种方法来获取我正在启动的进程的真实 pid,而不是僵尸进程的 pid。
问问题
862 次
1 回答
0
僵尸进程是一个死进程,它的数据仍然由操作系统保存以返回给调用进程(退出值等)。你不能杀死一个僵尸进程,因为它已经死了。有两种方法可以摆脱它;在父进程退出之前或者Popen.wait()
在后台使用Popen.poll()
父进程是否应该继续运行,或者杀死所有父进程,直到僵尸的父进程是1 init
,并且 init 将自动收割它。然后,您应该更新您的进程退出的数据库,因为 linux 可能会为一个新的不相关进程提供相同的 pid(您最终可能会杀死一个您不打算杀死的进程)。
如果您只需要停止该过程,请不要担心 - 它已经停止了。但是,您确实需要担心系统中的僵尸过多(有人说即使是 1 也太多了),因为 linux 会为每个进程发出一个 pid,而这些僵尸过多可能会阻止您运行新进程过程。
有一种技巧可以强制父进程在这里收割他们的孩子。
于 2013-10-18T16:58:48.663 回答