Node.js中如何保持子进程活跃并持续向其下发运行指令
Node.js 持久化持有子进程并持续下发指令实现方案
你当前使用的exec()属于单次执行类API,命令运行完成后进程会自动销毁,无法满足持续交互的需求。要实现长期持有XR_Command进程、反复下发指令,需要使用child_process模块的spawn()方法,它可以暴露子进程的标准输入输出流,支持双向持续通信。
完整实现代码
const { spawn } = require("child_process"); // 启动持久化运行的XR_Command子进程 const xrProcess = spawn('XR_Command', ['-i', '192.168.0.100'], { stdio: ['pipe', 'pipe', 'pipe'] // 配置标准输入/输出/错误流为可管道通信 }); // 监听子进程标准输出 xrProcess.stdout.on('data', (data) => { console.log(`子进程输出: ${data.toString()}`); }); // 监听子进程错误输出 xrProcess.stderr.on('data', (data) => { console.error(`子进程错误: ${data.toString()}`); }); // 监听子进程退出事件 xrProcess.on('exit', (code, signal) => { console.log(`子进程已退出,退出码: ${code}, 信号: ${signal}`); }); // 监听子进程启动错误 xrProcess.on('error', (err) => { console.error(`子进程启动失败: ${err.message}`); }); /** * 向XR_Command子进程下发指令的方法 * @param {string} command 要下发的指令,如/ch/01/on */ function sendCommand(command) { if (xrProcess.stdin.writable) { // 写入指令必须加换行符,标识单条指令输入结束 xrProcess.stdin.write(`${command}\n`, (err) => { if (err) { console.error(`指令写入失败: ${err.message}`); } }); } else { console.error('子进程输入流已关闭,无法下发指令'); } } // 示例:依次下发三条指令 setTimeout(() => sendCommand('/ch/01/on'), 1000); setTimeout(() => sendCommand('/ch/02/on'), 2000); setTimeout(() => sendCommand('/ch/03/on'), 3000); // 示例:主进程退出时自动关闭子进程 process.on('SIGINT', () => { console.log('主进程即将退出,正在关闭子进程...'); xrProcess.kill(); process.exit(0); });
关键注意事项
- 启动子进程时需要把命令和参数拆分为独立的数组元素传入,不要拼接为完整字符串,避免空格、特殊字符解析错误
- 写入指令时必须添加换行符
\n,绝大多数命令行工具以换行作为单条指令的结束标识,不加换行子进程会认为指令未输入完成,不会执行 - 需要监听子进程的
error、exit事件,及时处理进程崩溃、异常退出的场景,避免出现僵尸进程 - 主进程退出前主动调用
xrProcess.kill()关闭子进程,避免子进程变成孤儿进程残留运行
内容的提问来源于stack exchange,提问作者Cornelius Qualley
相关产品推荐
相关产品推荐

