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
相关产品推荐
相关产品推荐

