You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器内父进程发送给子进程的SIGTERM信号被忽略问题求助

问题根因与解决方案

容器环境下ffmpeg忽略SIGTERM信号通常和它的交互模式配置、进程组归属有关,按以下步骤修改即可解决:

  1. 给ffmpeg启动命令添加-nostdin参数
    ffmpeg默认会尝试读取标准输入来响应交互指令,容器环境下标准输入默认是关闭状态,这会导致ffmpeg进入挂起状态无视所有常规信号。只要在ffmpeg命令的最前面加上-nostdin参数,禁止它读取标准输入即可。
    示例修改:
    原命令:ffmpeg -i rtsp://摄像头地址 输出文件路径
    新命令:ffmpeg -nostdin -i rtsp://摄像头地址 输出文件路径
    可选补充添加-y参数,让ffmpeg遇到已存在的输出文件时自动覆盖,无需等待交互确认,避免额外的卡住场景。

  2. 修改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,提问作者Арсений Величко

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:24:07