当我使用 subprocess 模块从另一个 python 脚本中启动 python 脚本时,子进程“完成”时会创建一个僵尸进程。除非我杀死我的父 python 进程,否则我无法杀死这个子进程。

有没有办法在不杀死父进程的情况下杀死子进程?我知道我可以通过使用 wait() 来做到这一点,但我需要使用 no_wait() 运行我的脚本。

最佳答案

僵尸进程不是真正的进程;它只是进程表中的剩余条目,直到父进程请求子进程的返回代码。实际进程已经结束,除了所述进程表条目外不需要其他资源。

我们可能需要更多有关您运行的流程的信息才能真正提供更多帮助。

但是,如果您的 Python 程序知道子进程何时结束(例如,到达子标准输出数据的末尾),那么您可以安全地调用 process.wait() :

import subprocess

process= subprocess.Popen( ('ls', '-l', '/tmp'), stdout=subprocess.PIPE)

for line in process.stdout:
        pass

subprocess.call( ('ps', '-l') )
process.wait()
print "after wait"
subprocess.call( ('ps', '-l') )

示例输出:
$ python so2760652.py
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S   501 21328 21326  0  80   0 -  1574 wait   pts/2    00:00:00 bash
0 S   501 21516 21328  0  80   0 -  1434 wait   pts/2    00:00:00 python
0 Z   501 21517 21516  0  80   0 -     0 exit   pts/2    00:00:00 ls <defunct>
0 R   501 21518 21516  0  80   0 -   608 -      pts/2    00:00:00 ps
after wait
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S   501 21328 21326  0  80   0 -  1574 wait   pts/2    00:00:00 bash
0 S   501 21516 21328  0  80   0 -  1467 wait   pts/2    00:00:00 python
0 R   501 21519 21516  0  80   0 -   608 -      pts/2    00:00:00 ps

否则,您可以将所有子项保留在一个列表中,并且时不时地将 .poll 作为返回码。每次迭代后,请记住从列表中删除返回代码不同于 None 的子项(即完成的子项)。

关于python - 如何使用子进程模块杀死(或避免)僵尸进程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2760652/

10-14 13:00
查看更多