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

Node spawn问题:Linux管道首个进程退出后exit事件未触发

问题原因

你遇到的问题核心是:shell: true启动的是shell进程(比如bash),而管道后的while :; do ... done是无限循环——即使ffmpeg退出并关闭了管道写端,dd会因为读取到EOF立即退出,但while会立刻重新启动dd,导致shell进程永远不会终止,自然不会触发prc.on('exit')事件。

解决方案

方案1:修改shell命令,让循环自动终止

调整命令逻辑,让循环在ffmpeg输出结束后停止。可以通过检测dd读取的内容长度来终止循环,修改后的命令如下:

const command = 'ffmpeg -i [INPUT] -f mpegts pipe:1 | while true; do chunk=$(dd bs=65536 count=1 2>/dev/null); if [ ${#chunk} -eq 0 ]; then break; fi; echo -n "$chunk" | redis-cli -x PUBLISH myChannel; done';

const prc = spawn(command, [], { shell: true, stdio: ['ignore', 'ignore', 'pipe'] });

prc.on('exit', () => {
  // 现在ffmpeg退出后,循环会终止,shell进程退出,这个事件会触发
});

注意:这种方式处理二进制数据可能存在风险(比如echo -n可能无法完全保留特殊二进制内容),如果你的mpegts流包含特殊字节,建议使用方案2。

方案2:用Node.js手动管理多进程(推荐)

放弃shell管道,直接用Node.js分别启动ffmpeg、dd和redis-cli进程,手动管理数据流,精确控制每个进程的生命周期:

const { spawn } = require('child_process');

// 启动ffmpeg进程,输出到管道
const ffmpeg = spawn('ffmpeg', ['-i', '[INPUT]', '-f', 'mpegts', 'pipe:1'], {
  stdio: ['ignore', 'pipe', 'pipe'] // 忽略stdin,stdout和stderr留作处理
});

// 定义分块处理函数
const processNextChunk = () => {
  // 启动dd读取65536字节
  const dd = spawn('dd', ['bs=65536', 'count=1'], {
    stdio: ['pipe', 'pipe', 'ignore'] // 从ffmpeg的stdout读,输出到redis-cli
  });

  // 启动redis-cli发布数据
  const redisCli = spawn('redis-cli', ['-x', 'PUBLISH', 'myChannel'], {
    stdio: ['pipe', 'ignore', 'ignore'] // 从dd的stdout读
  });

  // 管道连接:ffmpeg -> dd -> redis-cli
  ffmpeg.stdout.pipe(dd.stdin, { end: false });
  dd.stdout.pipe(redisCli.stdin);

  // 监听dd的退出事件
  dd.on('exit', (code) => {
    if (code === 0) {
      // 成功读取一块,继续处理下一块
      processNextChunk();
    } else {
      // dd退出(通常是因为ffmpeg已经没有输出),清理进程
      redisCli.kill();
      console.log('所有数据处理完成');
    }
  });

  // 监听ffmpeg的退出事件
  ffmpeg.on('exit', () => {
    dd.kill();
    redisCli.kill();
    console.log('ffmpeg已退出');
  });
};

// 开始处理
processNextChunk();

这种方式完全由Node.js控制进程,避免了shell无限循环的问题,还能更灵活地处理每个进程的错误和退出事件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:23:15