首页 > 解决方案 > 在 Google Cloud 上使用 FFMPEG 运行后台进程运行在中间停止

问题描述

我有一个外部 bash 脚本,它使用 FFmpeg 对音频文件进行转码,然后将文件上传到谷歌云存储。我正在为这个过程使用谷歌云运行平台,但是这个过程在中间停止并且没有从日志中得到任何线索。我正在使用 node js spawn 命令来执行 bash 脚本

    const createHLSVOD = spawn('/bin/bash', [script, file.path, file.destination, contentId, EPPO_MUSIC_HSL_URL, 'Content', speed]);
    createHLSVOD.stdout.on('data', d => console.log(`stdout info: ${d}`));
    createHLSVOD.stderr.on('data', d => console.log(`stderr error: ${d}`));
    createHLSVOD.on('error', d => console.log(`error: ${d}`));
    createHLSVOD.on('close', code => console.log(`child process ended with code ${code}`));

在云上运行开始过程本身需要很多时间,但在我的本地机器上转码和上传非常快。一段时间后,转码日志被停止,没有新的日志出现。我不知道发生了什么

谷歌云运行日志

那么这里发生了什么?为什么它首先非常慢以及为什么进程在中间停止而没有任何错误

节点js脚本

转码脚本

Dockerfile

标签: node.jsgoogle-cloud-platformffmpeggoogle-cloud-storagegoogle-cloud-run

解决方案


问题spawn在于您创建了一个在后台运行的异步进程。这是一个问题,因为 Cloud Run 仅在处理请求时才允许 CPU 使用容器。在你的情况下,你有那个

  • 一个请求到达
  • 创建了一个 spawn
    • 生成的脚本在后台运行
  • 在请求中发送 HTTP 应答。Cloud Run 会限制 CPU
    • 您生成的脚本继续运行

有2个后果

  • 您的脚本处理非常长,因为节流将 CPU 限制在 5% 以下
  • 经过一段时间的活动(即实例接收到请求)后,Cloud Run 将未使用的实例杀死到其一侧的相同资源。大约15分钟,但可能会发生变化,是谷歌云内部酱

我建议您等待生成的脚本结束或使用同步调用;例如execSync, 而不是 async spawn


推荐阅读