使用pid在python中终止子进程

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

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

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

如果你只需要停止这个过程,那么别担心,它已经停止了。但是,您确实需要担心系统中有太多的僵尸——有人说1个僵尸也太多了,因为linux会为每个进程发出一个pid,而这些僵尸太多可能会妨碍您运行新进程


有一种黑客可以强迫父进程收获它们的子进程。

我只想得到进程的正确pid,而不是僵尸的pid。我想我不能接受这个答案。无论如何,谢谢你。你有正确的pid。没有其他pid。进程已以pid启动,并已退出。pid不会改变。你得到了正确的pid,但是除了上面的,你没有办法收获它。也许会有帮助。