最近在用 python 调用 ffmpeg 拉取网络流,有时候执行 kill -9 ffmpeg_pid
可以正常终止 ffmpeg 进程,但是有时候执行后 ffmpeg 进程就变成 [ffmpeg]
, 然后就无法 kill 了,python 进程也在阻塞状态,只能终止 python 进程,这个 [ffmpeg]
进程也退出了,这是什么情况?
1
ClericPy 2020-03-25 11:10:05 +08:00
没什么代码么, 直接听起来像是 kill 以后父进程没 wait 导致了僵尸进程, 进程标记有写它现在的状态和父进程吗
|
2
Sasasu 2020-03-25 11:12:19 +08:00
进程处于 zombie 状态
|
3
fenghuang OP @ClericPy #1 上代码
```python cmd = 'ffmpeg ...' r = subprocess.Popen(shlex.split(cmd), stderr=subprocess.PIPE) time.sleep(3600) subprocess.run("kill -9 {pid}".format(pid=r.pid), shell=True) ``` |
4
nightwitch 2020-03-25 11:30:55 +08:00 1
@fenghuang ffmpeg 进程被你的 Python 进程拉起,父进程是 Python,你要在 Python 里面给它收尸体才不会变成僵尸进程。平时我们可以用 kill 杀进程是因为进程的父进程 init 会自动收尸。
正确代码 ``` cmd = 'ffmpeg ...' r = subprocess.Popen(shlex.split(cmd), stderr=subprocess.PIPE) time.sleep(3600) r.terminate() #要求子进程结束 r.wait() #给子进程收尸 ``` |
5
MoYi123 2020-03-25 11:42:29 +08:00
往里面写一个 b‘q’ 就可以退出.
|
7
fenghuang OP @nightwitch #4 我试一下 非常感谢
|
8
MoYi123 2020-03-25 12:45:52 +08:00
Popen.communicate(input=b'q'),可以先在 shell 里试一下运行 ffmpeg xxx 后按 q 能不能退出
|
9
Kobayashi 2020-03-25 20:40:49 +08:00 via Android
难道没有人注意到 subprocess 有超时参数可以传吗?
|
11
fenghuang OP 发现变成[ffmpeg]的原因了 ffmepg 进程自己卡死了,这时候什么命令都无法终止了,只能结束 python 主进程才行
|