我在python中使用subprocess来启动一个程序。当它启动时,它会保存在数据库中创建的进程的pid。一段时间后如果触发器发生,它需要停止这个进程并启动一个新进程。 问题是,当我使用subprocess.Popen()。pid时,它返回僵尸进程的pid(defunct)而不是我需要停止的实际进程。我不能使用terminate命令,因为start process命令和kill命令发生在不同的脚本中。所以我需要一种方法来获得我正在开始的过程的真实pid而不是僵尸过程的pid。
答案 0 :(得分:0)
僵尸进程是一个死进程,其数据仍由os保存,以返回到调用进程(退出值等)。你不能杀死一个僵尸进程,因为它已经死了。有两种方法可以摆脱它;如果父进程应该继续运行,则使用Popen.wait()
使用Popen.poll()
进行子进程1 init
,或者杀死所有父进程,直到僵尸的父进程为{{1}}为止,和init将自动收获它。然后,您应该更新您的进程退出的数据库,因为Linux可能会为新的无关进程提供相同的pid(您最终可能会杀死一个您不想杀死的进程)。
如果你只需要停止这个过程,那就别担心 - 它已经停止了。但是,你确实需要担心系统中有太多的僵尸(有人说甚至1太多了),因为linux会为每个进程发出一个pid,并且有太多这些僵尸可能会阻止你运行新的过程
迫使父进程收获他们的孩子here。