【发布时间】:2019-07-29 19:51:28
【问题描述】:
我一直在试图弄清楚如何启动不同的子进程实例,然后杀死它们,然后创建新的。父 python 进程永远不会这样做,它只会杀死子进程。我在 SO 上关注了很多链接,但是一旦父 python 进程结束,我就会不断收到以下消息:
F/Users/Lucifer/miniconda3/envs/rltp/lib/python3.6/subprocess.py:761: ResourceWarning: subprocess 40909 is still running ResourceWarning, source=self)
这似乎很有趣,因为我做了ps 但我什么也没得到:
PID TTY TIME CMD
7070 ttys001 0:00.06 /Applications/iTerm.app/Contents/MacOS/iTerm2 --server login -fp Lucifer
7072 ttys001 0:00.61 -bash
17723 ttys002 0:00.06 /Applications/iTerm.app/Contents/MacOS/iTerm2 --server login -fp Lucifer
17725 ttys002 0:00.06 -bash
38586 ttys002 0:00.16 sertop --no_init
我只是想启动一个进程:
self.serapi = subprocess.Popen(['sertop','--no_init'],
stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,
preexec_fn=os.setsid,shell=True
,)
杀死它:
os.killpg(os.getpgid(self.serapi.pid), signal.SIGTERM)
上面的代码基本上是从上面的答案复制过来的:
How to terminate a python subprocess launched with shell=True
但我不确定为什么会收到此消息。我是否成功杀死了子进程?我计划开始并杀死他们中的许多人。
注意我不知道也不需要shell=True。我只是复制了那个,因为我发布的答案/问题就是这样。我宁愿没有那个参数。
根据我试过的答案:
def kill(self):
self.serapi.wait()
#self.serapi.kill()
self.serapi.terminate()
#os.killpg(os.getpgid(self.serapi.pid), signal.SIGTERM)
#self.serapi.wait()
以及上述的不同排列,但似乎没有任何效果。有什么建议吗?
【问题讨论】:
-
您在子流程上是否
wait()?即使在子进程退出后,它仍然是僵尸,直到其父进程调用wait()并检索其退出状态。 -
@DanielPryden 我没有打电话给
wait(),直到你提到它,我才知道电话的存在。 -
太棒了!我想了很多,这就是我在下面写答案的原因。如果您觉得它有用,请随时点赞和/或接受它。很高兴我能帮上忙!
-
@DanielPryden 看着调用
wait()的码头,如果两者都是stdout,stderr = PIPE,似乎会陷入僵局,除了我的过程永远不会结束,直到我告诉它结束。
标签: python subprocess kill kill-process