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

Node.js使用spawn运行持续bash命令时如何每次获取完整输出?

实现方案

top -b的批处理模式下,每轮完整输出的第一行固定以top - 开头,你可以用这个特征作为单轮输出的分隔标识,通过全局缓冲区拼接流式返回的内容,拆分出完整的单轮输出后再推送,不需要重复spawn进程。

完整代码实现

import { spawn } from 'child_process'

// 可按需调整top刷新间隔,-d 后面的数字是秒数,支持小数比如0.5
const command = 'top'
const args = ['-b', '-d', '1']
const child = spawn(command, args)

// 全局缓冲区,存储不完整的输出片段
let stdoutBuffer = ''

child.stdout.setEncoding('utf8')
child.stdout.on('data', (data) => {
    // 新内容拼到缓冲区末尾
    stdoutBuffer += data.toString()
    // 按单轮输出的开头标识分割
    const chunks = stdoutBuffer.split('top - ')
    // 最后一段是不完整的下一轮输出,存回缓冲区
    stdoutBuffer = chunks.pop()
    // 前面的所有段都是完整的单轮输出,补回开头标识后处理
    chunks.forEach(chunk => {
        if (chunk.trim()) {
            const fullOutput = `top - ${chunk}`
            // 这里执行你要的操作,比如通过websocket推前端
            console.log('===== 完整单轮输出 =====')
            console.log(fullOutput)
        }
    })
})

// 可选:错误处理
child.stderr.on('data', (err) => {
    console.error('top进程错误:', err.toString())
})
child.on('close', (code) => {
    console.log('top进程退出,退出码:', code)
})

方案说明

  • 全程仅启动一个top后台进程,性能开销极低
  • 分隔标识top - 是top输出的固定格式,不会和输出内容的其他部分冲突,识别准确率高
  • 如果要适配其他持续输出的命令,只要找到对应命令每轮输出的固定开头/结尾标识,用同样的缓冲区拆分逻辑即可实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 08:18:04