当前位置: 首页 > news >正文

nodejs利用子进程child_process执行命令及child.stdout输出数据

直接上代码

const {spawn}=require('node:child_process');
//为什么是slice(2),因为Nodejs的process.argv输出的第0个是执行程序node.exe,第1个是文件路径,第2个才是参数
const [command,...rest]=process.argv.slice(2);
//返回执行命令和参数,如ls -lh 返回结果是:'ls',['-lh'],当然你也可以执行其它的命令如nodejs的
console.log(command,rest);
//开启子进程spawn()方法
const sp=spawn(command,rest);
let output=[],errorOutput=[];
//子进程的stdin,stdout,stderr都是stream对象中的,不是继承于process主进程
//子进程接收到的数据,添加到数组中
sp.stdout.on('data',(data)=>{output.push(data);
});
//子进程将错误添加到数组中
sp.stderr.on('data',(data)=>{errorOutput.push(data);
});//子进程关闭,输出命令的结果
sp.on('close',(code)=>{const outputstr=code===0?Buffer.concat(output).toString() :Buffer.concat(errorOutput).toString();const printText=outputstr.toString().split(/\r?\n/);console.log('Get the output:\r\n',printText);
});
sp.on('exit',(code)=>{console.log(`child process exited with code ${code}`);
})

如果你要在主进程中输出结果

const { spawn } = require('node:child_process');
const process = require('node:process');
const [command, ...rest] = process.argv.slice(2);console.log(command, rest);//在这里增加stdio:'inherit',表示继承主进程输出
const sp = spawn(command, rest, { stdio: 'inherit' });sp.on('close', (code) => {if (code === 0) {console.log('Command executed successfully');} else {console.log('Command failed with exit code', code);}
});sp.on('exit', (code) => {console.log(`child process exited with code ${code}`);
});

如果用管道模式Pipe形势

const {spawn}=require('node:child_process');
const path=require('node:path');
//这里stdio:[0,'pipe',2]即表示pipe输出
let child=spawn('node',['subchild.js','--port','1337'],{cwd:path.join(__dirname,'test'),stdio:[0,'pipe',2]});
child.stdout.on('data',function(data){console.log(data.toString());
});child.on('close',function(){console.log('child process was closed.');
})
child.on('exit',function(){console.log('child process was exit');
})

//这里是subchild.js

console.log(process.argv);
process.stdout.write('123');

如果使用IPC模式, IPC 的额外通道,允许你在父进程和子进程之间发送和接收消息

const {spawn}=require('node:child_process');
const path=require('node:path');
let child=spawn('node',['ipc.js'],{cwd:path.join(__dirname,'test'),stdio:['ipc']
});
child.on('message',(data)=>{console.log(data);
});
child.send('world');

//ipc.js文件

process.on('message',(message)=>{console.log('接收到父进程信息:',message);process.send({response:'hello form child'});
})

这样就可以在主进程和子进程进行信息的传递


http://www.mrgr.cn/news/81024.html

相关文章:

  • springboot463学生信息管理系统论文(论文+源码)_kaic
  • 数字经济下的 AR 眼镜
  • xcode15 报错 does not contain ‘libarclite‘
  • 活动预告|云原生创新论坛:知乎携手 AutoMQ、OceanBase、快猫星云的实践分享
  • (OCPP服务器)SteVe编译搭建全过程
  • Apple Vision Pro 开发教程:通过 TestFlight 把开发的程序安装到其他的设备上测试
  • LLMs之rStar:《Mutual Reasoning Makes Smaller LLMs Stronger Problem-Solvers》翻译与解读
  • 开源知识库open source knowledge base
  • 计算机毕业设计hadoop+spark知网文献论文推荐系统 知识图谱 知网爬虫 知网数据分析 知网大数据 知网可视化 预测系统 大数据毕业设计 机器学习
  • 5G -- 网络安全
  • 【测试】APP测试
  • Go by Example学习
  • LeetCode 刷题笔记
  • qemu源码解析【06】qemu启动初始化流程
  • Ubuntu 22.04,Rime / luna_pinyin.schema 输入法:外挂词库,自定义词库 (****) OK
  • Docker 入门:如何使用 Docker 容器化 AI 项目(一)
  • ubuntu 安装更新 ollama新版本
  • CAD xy坐标标注(跟随鼠标位置实时移动)——C#插件实现
  • 备忘一个FDBatchMove数据转存的问题
  • 分析excel硕士序列数据提示词——包含对特征的筛选,非0值的过滤
  • Halcon单相机+机器人=眼在手上#标定心得
  • SQL进阶技巧:如何计算商品需求与到货队列表进出计划?
  • Linux Shell 脚本编程基础知识篇(一)
  • Restaurants WebAPI(三)——Serilog/FluenValidation
  • Jenkins
  • lc148链表排序——链表版归并排序