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

Node.js中child_process spawn调用bash脚本时data事件未触发

解决Node.js spawn调用bash脚本无法捕获stdout的问题

我来帮你排查这个问题,你遇到的情况大概率是几个细节没处理好,咱们一步步来解决:

1. 先确认脚本本身的可用性

首先手动在终端执行你的脚本,确保它能正常输出内容:

./start_recording.sh

如果手动执行都没输出,那问题出在脚本本身,先检查脚本的语法和执行权限(类Unix/WSL环境下需要给脚本加可执行权限:chmod +x start_recording.sh)。

2. 调整spawn的调用参数

你当前的调用在跨平台场景下有坑:Windows环境默认shell:true会用cmd.exe执行,而.sh脚本需要bash解释器;类Unix环境下则不需要额外开启shell:true。修正后的代码如下:

const { spawn } = require('child_process');
// 明确指定用bash执行脚本,路径用相对路径更稳妥
const subprocess = spawn('bash', ['./start_recording.sh'], { 
  shell: process.platform === 'win32' // 仅Windows环境需要开启shell
});

// 监听stdout数据
subprocess.stdout.on('data', (data) => {
  const output = data.toString().trim();
  console.log(`Received chunk: ${output}`);
});

// 关键:监听错误输出和进程异常,排查隐藏问题
subprocess.stderr.on('data', (data) => {
  console.error(`脚本错误输出: ${data.toString()}`);
});

subprocess.on('error', (err) => {
  console.error(`进程启动失败: ${err.message}`);
});

subprocess.on('close', (code) => {
  console.log(`脚本执行结束,退出码: ${code}`);
});

3. 处理极端情况:输出缓冲问题

如果后续你的脚本有更多复杂输出,可能遇到bash输出缓冲导致data事件延迟触发的情况。可以在脚本里强制刷新输出缓冲区:

#!/bin/bash
echo something
# 强制将输出刷到stdout
echo "another line" >&1

或者在调用时使用unbuffer工具(需要先安装:sudo apt install expect):

const subprocess = spawn('unbuffer', ['bash', './start_recording.sh']);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:21:35