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

调用FFmpeg生成视频时Apache触发SIGWINCH异常崩溃求助

排查Apache因SIGWINCH崩溃的思路与解决方案

核心背景

SIGWINCH是终端窗口大小变化时触发的信号,但Apache的prefork子进程收到该信号会触发优雅关闭,你的问题大概率是调用链中某环节意外发送了这个信号,或是资源耗尽引发了异常行为。

分步排查与修复

  • 检查终端交互类代码
    排查Python脚本和FFmpeg命令:

    • 确认Python里没有使用curses库、tput/stty这类终端控制命令,这些操作会向当前进程组发送SIGWINCH,Apache子进程所在组收到信号后会触发关闭。
    • 检查FFmpeg命令是否包含-interactive、-tty这类强制终端交互的参数,Apache运行环境无真实终端,这类参数会引发异常信号。
  • 验证权限与环境一致性

    • 切换到Apache运行用户(通常是www-data),手动执行完整调用链:php 你的脚本.php,或直接运行Python生成的FFmpeg命令,看是否会触发同样问题。如果命令行执行正常,说明是Web环境的变量(如PATH、TERM)导致的异常。
    • 确认音视频文件、临时目录的权限,确保Apache用户有读/写/执行权限,权限不足可能引发进程异常行为,间接触发信号。
  • 调整Apache MPM配置

    • FFmpeg是CPU/内存密集型操作,检查prefork模式的MaxRequestWorkers、MaxConnectionsPerChild配置,避免单个FFmpeg进程耗尽资源导致Apache子进程异常。可以临时降低MaxRequestWorkers,或设置MaxConnectionsPerChild让子进程处理一定请求后重启,避免资源泄漏。
    • 尝试切换到worker或event MPM模式,这类模式的进程模型和prefork不同,可能规避SIGWINCH的触发问题。
  • 隔离调用链缩小范围

    • 跳过Python:直接在PHP中写固定的简单FFmpeg命令(比如ffmpeg -i input.mp4 -c copy output.mp4),用escapeshellcmd执行,看是否崩溃。如果不崩溃,问题出在Python脚本的FFmpeg命令生成逻辑。
    • 跳过PHP:用Apache用户直接运行Python脚本生成并执行FFmpeg命令,看是否会影响Apache。如果单独执行没问题,问题出在PHP调用的进程管理环节。
  • 增加日志定位触发点

    • 在PHP脚本中添加日志,记录调用Python前、调用后、FFmpeg执行的PID和状态,比如:
      error_log("Starting Python script at " . date('Y-m-d H:i:s'));
      $output = shell_exec(escapeshellcmd('python3 your_script.py'));
      error_log("Python output: " . $output);
      $status = $?;
      error_log("FFmpeg command exit code: " . $status);
      
    • 在Python脚本中添加日志,记录FFmpeg命令的生成内容、执行前后的系统状态,排查是否有异常输出或错误导致信号发送。

内容的提问来源于stack exchange,提问作者damii1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 01:25:37