调用FFmpeg生成视频时Apache触发SIGWINCH异常崩溃求助
排查Apache因SIGWINCH崩溃的思路与解决方案
核心背景
SIGWINCH是终端窗口大小变化时触发的信号,但Apache的prefork子进程收到该信号会触发优雅关闭,你的问题大概率是调用链中某环节意外发送了这个信号,或是资源耗尽引发了异常行为。
分步排查与修复
检查终端交互类代码
排查Python脚本和FFmpeg命令:- 确认Python里没有使用
curses库、tput/stty这类终端控制命令,这些操作会向当前进程组发送SIGWINCH,Apache子进程所在组收到信号后会触发关闭。 - 检查FFmpeg命令是否包含
-interactive、-tty这类强制终端交互的参数,Apache运行环境无真实终端,这类参数会引发异常信号。
- 确认Python里没有使用
验证权限与环境一致性
- 切换到Apache运行用户(通常是
www-data),手动执行完整调用链:php 你的脚本.php,或直接运行Python生成的FFmpeg命令,看是否会触发同样问题。如果命令行执行正常,说明是Web环境的变量(如PATH、TERM)导致的异常。 - 确认音视频文件、临时目录的权限,确保Apache用户有读/写/执行权限,权限不足可能引发进程异常行为,间接触发信号。
- 切换到Apache运行用户(通常是
调整Apache MPM配置
- FFmpeg是CPU/内存密集型操作,检查prefork模式的
MaxRequestWorkers、MaxConnectionsPerChild配置,避免单个FFmpeg进程耗尽资源导致Apache子进程异常。可以临时降低MaxRequestWorkers,或设置MaxConnectionsPerChild让子进程处理一定请求后重启,避免资源泄漏。 - 尝试切换到
worker或eventMPM模式,这类模式的进程模型和prefork不同,可能规避SIGWINCH的触发问题。
- FFmpeg是CPU/内存密集型操作,检查prefork模式的
隔离调用链缩小范围
- 跳过Python:直接在PHP中写固定的简单FFmpeg命令(比如
ffmpeg -i input.mp4 -c copy output.mp4),用escapeshellcmd执行,看是否崩溃。如果不崩溃,问题出在Python脚本的FFmpeg命令生成逻辑。 - 跳过PHP:用Apache用户直接运行Python脚本生成并执行FFmpeg命令,看是否会影响Apache。如果单独执行没问题,问题出在PHP调用的进程管理环节。
- 跳过Python:直接在PHP中写固定的简单FFmpeg命令(比如
增加日志定位触发点
- 在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命令的生成内容、执行前后的系统状态,排查是否有异常输出或错误导致信号发送。
- 在PHP脚本中添加日志,记录调用Python前、调用后、FFmpeg执行的PID和状态,比如:
内容的提问来源于stack exchange,提问作者damii1
相关产品推荐
相关产品推荐

