我的基于
asyncio
的 Python 代码使用 asyncio.create_subprocess_exec
启动了两个子进程。我希望一个将数据输出到标准输出,另一个在数据可用时通过管道读取它(在我的例子中,第一个进程输出视频帧,第二个进程对它们进行编码 - 它是ffmpeg
)。
我发现创建 asyncio
可用的管道的唯一方法是在 this post 中。但是按照该方法,第二个进程 (ffmpeg
) 崩溃并出现错误“文件描述符错误”。鉴于使用壳管时设置工作正常,我决定使用 asyncio.create_subprocess_shell
来为我处理管道。但是这两个进程都设计为永远运行直到中断,所以我需要一种方法来终止它们。在 .terminate()
返回的进程上调用 create_subprocess_shell
,或者用 SIGTERM
或 SIGINT
杀死它什么都不做。我怎样才能杀死这些进程?
.terminate()
不做任何事情的原因是 Bash 进程默认拦截信号并且不会将它们传播到正在运行的命令。解决方法是从进程对象中获取pid
,并使用psutil
来获取该进程的所有子进程,并一个接一个地终止它们然后杀死shell本身。