Docker容器内父进程发送给子进程的SIGTERM信号被忽略问题求助
问题根因与解决方案
容器环境下ffmpeg忽略SIGTERM信号通常和它的交互模式配置、进程组归属有关,按以下步骤修改即可解决:
给ffmpeg启动命令添加
-nostdin参数
ffmpeg默认会尝试读取标准输入来响应交互指令,容器环境下标准输入默认是关闭状态,这会导致ffmpeg进入挂起状态无视所有常规信号。只要在ffmpeg命令的最前面加上-nostdin参数,禁止它读取标准输入即可。
示例修改:
原命令:ffmpeg -i rtsp://摄像头地址 输出文件路径
新命令:ffmpeg -nostdin -i rtsp://摄像头地址 输出文件路径
可选补充添加-y参数,让ffmpeg遇到已存在的输出文件时自动覆盖,无需等待交互确认,避免额外的卡住场景。修改Python侧的进程启动与信号发送逻辑
如果你使用subprocess.Popen启动ffmpeg,建议添加start_new_session=True参数让ffmpeg成为独立进程组的首进程,停止时直接给整个进程组发信号,避免ffmpeg派生的子进程残留:import subprocess import os import signal # 启动ffmpeg ffmpeg_proc = subprocess.Popen( ["ffmpeg", "-nostdin", "-i", "rtsp://你的摄像头RTSP地址", "/output/录制视频.mp4"], start_new_session=True, stdout=subprocess.DEVNULL, # 可选,不需要ffmpeg日志时添加,避免输出缓冲区满导致进程挂起 stderr=subprocess.DEVNULL ) # 停止ffmpeg os.killpg(os.getpgid(ffmpeg_proc.pid), signal.SIGTERM)
你配置的init: true已经解决了PID1进程不转发信号的问题,不需要额外修改Docker相关配置,按上述步骤修改应用代码即可解决问题。
内容的提问来源于stack exchange,提问作者Арсений Величко
相关产品推荐
相关产品推荐

