node.js - 在 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}`));
在云上运行开始过程本身需要很多时间,但在我的本地机器上转码和上传非常快。一段时间后,转码日志被停止,没有新的日志出现。我不知道发生了什么
那么这里发生了什么?为什么它首先非常慢以及为什么进程在中间停止而没有任何错误
解决方案
问题spawn
在于您创建了一个在后台运行的异步进程。这是一个问题,因为 Cloud Run 仅在处理请求时才允许 CPU 使用容器。在你的情况下,你有那个
- 一个请求到达
- 创建了一个 spawn
- 生成的脚本在后台运行
- 在请求中发送 HTTP 应答。Cloud Run 会限制 CPU
- 您生成的脚本继续运行
有2个后果
- 您的脚本处理非常长,因为节流将 CPU 限制在 5% 以下
- 经过一段时间的活动(即实例接收到请求)后,Cloud Run 将未使用的实例杀死到其一侧的相同资源。大约15分钟,但可能会发生变化,是谷歌云内部酱
我建议您等待生成的脚本结束或使用同步调用;例如execSync
, 而不是 async spawn
。
推荐阅读
- python - matplotlib 中轴上的尴尬科学记数法
- visual-studio-code - 如何在客户端机器上使用 vscode 和无节点运行后台节点进程
- python - 如何在“QMainWindow”中滚动
- haskell - Using makeLens with Gloss gives "can't load framework: OpenGL (not found)"
- javascript - leaflet heatmap.js legend and tooltip
- python - Return a previous function inside function
- python - How to aggregate values from multiple columns from a Pandas DataFrameGroupBy object?
- pandas - How to add subtotals in a multi_index dataframe
- java - 更改焦点 JComboBox (Java Swing/AWT) 的默认颜色
- electron - Debugging Worker thread in electron