如何有效地杀死Python中的冻结子进程?

时间:2013-12-22 14:34:55

标签: python shell video ffmpeg

我正在处理一个相当奇怪的问题。

我为一年前版本的ffmpeg编写了一个Python包装器(在Python 2.6.6中)。问题是,给定一个非常特殊的视频,ffmpeg停止正常工作(笨重的输出,完整的CPU使用,没有结束阶段等),并使用它解决python解释器。

现在,如果我直接从终端运行我的编码选项ffmpeg并将有问题的视频作为输入,ffmpeg将不会立即回复Ctrl-c。我必须在退出之前等待10秒或更长时间,并给我回复提示。但是,如果我使用“健康”视频,它只会打印Received signal 2: terminating.并优雅地退出。

在python包装器中,我使用p.kill()无效。行为完全相同a.k.a我必须在程序退出前等待10秒。如果冻结某些有问题的视频,我怎能立即停止ffmpeg

请注意,如果我执行双Ctrl-c,无论如何都会立即收到提示。

2 个答案:

答案 0 :(得分:3)

你是如何执行FFmpeg子进程的?有很多方法可以在Python中启动和监控进程。

我曾经处理过这个问题,因为我曾经为FFmpeg项目运行连续自动化测试。当我需要调试它时,我会打印出我的程序认为对应于正在运行的FFmpeg进程的PID。然后我会使用topps来验证PID是否正确。 Linux和Mac OS X之间存在一些奇怪之处,涉及传递给Python函数的shell参数以及PID是与FFmpeg进程相关还是与启动FFmpeg进程的shell相关。

另请参阅:this old blog post I wrote exploring the problem, and the numerous responses

答案 1 :(得分:1)

如果你使用的是linux,你可以通过以下方式将它留给shell:

subprocess.call( "kill -9 $(pidof ffmpeg)", shell=True )