【Node.js从基础到高级运用】二十一、使用child_process模块创建子进程

引言

在Node.js中,child_process模块是一个提供了创建和管理子进程的能力的核心模块。通过使用child_process模块,Node.js可以执行系统命令、运行其他脚本或应用程序,实现与Node.js进程的并行处理。

child_process模块提供了几种创建子进程的方法,包括execexecFilespawnfork等。下面将详细介绍这些API函数,并提供示例代码及其功能解释。

1. exec

使用exec函数来执行一个简单的系统命令。

const { exec } = require('child_process');
exec('dir', (error, stdout, stderr) => {
  if (error) {
    console.error(`执行的错误: ${error}`);
    return;
  }
  console.log(`标准输出:\n${stdout}`);
  if (stderr) {
    console.error(`标准错误输出: ${stderr}`);
  }
});

2. execFile

execFile函数类似于exec,但是它直接执行文件而不是通过shell运行,这通常会更高效。

const { execFile } = require('child_process');

execFile('node', ['--version'], (error, stdout, stderr) => {
  if (error) {
    throw error;
  }
  console.log(stdout);
});
  • execFile('node', ['--version'], callback): 执行node命令并传入参数--version,获取Node.js的版本信息。
  • ['--version']: 参数数组,传递给node命令。
  • callback: 执行完成后的回调函数,包含错误信息、标准输出和标准错误输出。

execexecFile 都是 Node.js 中用于执行外部命令的方法,但它们之间有一些重要的区别。

  1. 参数传递:

    • exec 可以通过字符串直接传递命令及参数,例如 exec('ls -l', callback)
    • execFile 必须传递一个命令数组,第一个元素是命令,其余元素是参数,例如 execFile('ls', ['-l'], callback)
  2. 执行方式:

    • exec 在 shell 中执行命令,因此可以使用 shell 的特性,比如通配符和环境变量。这也使得在执行复杂命令时更加方便,但也更慢和潜在地更危险。
    • execFile 直接调用给定的可执行文件,而不使用 shell,因此执行速度更快,但不能使用 shell 特性。
  3. 回调参数:

    • 两者的回调函数都有 errorstdoutstderr 参数,用于处理执行结果和错误信息。

一般来说,如果需要使用 shell 的特性,或者要执行比较简单的命令,可以选择使用 exec;如果只需要调用可执行文件而不需要 shell 的功能,或者对性能要求较高,可以选择使用 execFile

3. spawn

spawn函数用于创建一个新的进程,它返回一个带有stdoutstderr流的子进程对象。你可以使用这些流来读取或写入数据。

const { spawn } = require('child_process');

// 使用spawn启动一个子进程来执行`ls`命令
//const child = spawn('ls', ['-lh', '/usr']);
const child = spawn('cmd.exe', ['/c', 'dir']);
// 监听子进程的stdout流
child.stdout.on('data', (data) => {
  // 当子进程的stdout流接收到数据时,打印到控制台
  console.log(`标准输出: ${data}`);
});

// 监听子进程的stderr流
child.stderr.on('data', (data) => {
  // 当子进程的stderr流接收到数据时,打印错误信息到控制台
  console.error(`标准错误输出: ${data}`);
});

// 监听子进程的关闭事件
child.on('close', (code) => {
  // 当子进程结束时,打印退出码到控制台
  console.log(`子进程退出码: ${code}`);
});
  • spawn('ls', ['-lh', '/usr']): 创建一个新的进程执行ls命令,列出/usr目录下的文件和目录详细信息。
  • child.stdout.on('data', callback): 监听标准输出流的data事件,当有数据时调用回调函数。
  • child.stderr.on('data', callback): 监听标准错误输出流的data事件。
  • child.on('close', callback): 监听进程结束事件。

请注意,如果你在Windows系统上运行此代码,可能需要修改命令或参数,因为ls命令在Windows命令提示符下不可用。在Windows上,你可以尝试使用dir命令:

const child = spawn('cmd.exe', ['/c', 'dir']);

这将使用Windows命令提示符的dir命令来列出当前工作目录下的文件和目录。

4. fork

fork函数是spawn的特殊形式,用于创建一个新的Node.js进程。它主要用于运行Node.js模块,并提供了在父进程子进程之间建立通信通道的能力。

const { fork } = require('child_process');

const child = fork('subprocess.js');

child.on('message', (message) => {
  console.log('收到子进程的消息:', message);
});

child.send({ hello: '我是父进程,给你传递消息' });
  • fork('subprocess.js'): 创建一个新的Node.js进程来运行subprocess.js模块。
  • child.on('message', callback): 监听子进程发送的消息。
  • child.send(message): 父进程向子进程发送消息。

subprocess.js中,你可以使用process.on('message')来接收父进程发送的消息,并使用process.send()来向父进程发送消息。

// subprocess.js

process.on('message',message=> {
  console.log('收到父进程的消息:', message);
})

process.send({ hello: '我是子进程' });

在这里插入图片描述

总结

以上就是child_process模块中几个主要API函数的介绍和示例。在实际开发中,根据需要,以满足不同的进程创建和管理需求。掌握child_process模块的使用,对于进行系统级编程、并行处理等高级Node.js开发任务至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/520038.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

搭建电商独立站|适合做独立站的国家有哪些?该怎么布局?

在传统外贸和跨境电商行业,独立站是一种更专业并且获益空间相对会更高的方法,独立站可以让卖家拥有更多的自由控制权,卖家能更精准的定位用户人群,也可以自行流量推广,独立站不会被永远封店铺、不会对卖家进行罚款等等…

HTML - 你如何使H5页面禁止手动缩放

难度级别:初级及以上 提问概率:40% 我们知道,这道题其实是在考察meta标签的viewport属性,正常情况下设置viewport的代码为 <head><meta name="viewport" content="width=device-width,initial-scale=1.0" …

560.和为K的子数组

560.和为K的子数组 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,1], k 2 输出&#xff1a;2示例 2&#xff1a; 输入&#xf…

线程池参数该怎么配置才能充分压榨CPU?

&#x1f3c3;‍♂️ 微信公众号: 朕在debugger© 版权: 本文由【朕在debugger】原创、需要转载请联系博主&#x1f4d5; 如果文章对您有所帮助&#xff0c;欢迎关注、点赞、转发和订阅专栏&#xff01; 目标 配置好线程池参数&#xff0c;压榨CPU&#xff0c;资本家看了都…

云备份day03

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C云备份项目 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 主要内容介绍了第三方库httplib的一些内容&#xff0c;以及实现…

易宝OA getStockInRequestPrintDetail SQL注入漏洞复现

0x01 产品简介 易宝OA系统是一种专门为企业和机构的日常办公工作提供服务的综合性软件平台,具有信息管理、 流程管理 、知识管理(档案和业务管理)、协同办公等多种功能。 0x02 漏洞概述 易宝OA getStockInRequestPrintDetail 接口处存在SQL注入漏洞,未经身份认证的攻击者…

Promise和async/await

Promise是异步编程的一种解决方案&#xff0c;用来解决多层回调嵌套的问题。它的构造函数是同步执行的&#xff0c;then 方法是异步执行的&#xff0c;所以创建后里面的函数会立即执行&#xff0c;构造函数中的resolve和reject只有第一次执行有效&#xff0c;也就是说Promise状…

随手集☞MySQL部分知识盘点(loading。。。)

字段类型 数值类型 INT: 整数类型&#xff0c;可以是正数或负数。根据显示宽度和是否有符号&#xff0c;其范围会有所不同。TINYINT: 非常小的整数。SMALLINT: 小的整数。MEDIUMINT: 中等大小的整数。BIGINT: 大整数。FLOAT: 单精度浮点数。DOUBLE: 双精度浮点数。DECIMAL(M,N…

Oracle的物理结构解析

这些图是我自己画的&#xff0c;我也会在我的公众号【会用数据库】解析。理解起来非常简单&#xff0c;而且非常好记。不用死记硬背&#xff0c;有兴趣可以来公众号看呀。

GitOps - 为 OpenShift GitOps 配置邮件通知

《OpenShift 4.x HOL教程汇总》 说明&#xff1a;本文已经 在OpenShift 4.15 OpenShift GitOps 1.11.2 环境中验证 文章目录 ArgoCD 的 Notification 功能简介启动 OpenShift GitOps 的 Notification 功能配置邮件通知验证参考 说明&#xff1a;先根据《OpenShift 4 之 GitOp…

Peter算法小课堂—树状数组

大家好&#xff0c;我是人见人爱&#xff0c;花见花开&#xff0c;车见车爆胎的树状数组Peter Pan&#xff0c;hhh 讲正文前&#xff0c;先来一个长文警告⚠很重要的知识点&#xff1a;L SB&#xff08;SB&#xff1f;&#xff09; LSB 怎么算呢&#xff1f; 哦……懂了&…

环形链表2--绝妙的运算

一、要求 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统…

静态路由协议实验综合实验

需求&#xff1a; 1、除R5的换回地址已固定外&#xff0c;整个其他所有的网段基于192.168.1.0/24进行合理的IP地址划分。 2、R1-R4每台路由器存在两个环回接口&#xff0c;用于模拟连接PC的网段&#xff1b;地址也在192.168.1.0/24这个网络范围内。 3、R1-R4上不能直接编写到…

机器学习KNN最邻近分类算法

文章目录 1、KNN算法简介2、KNN算法实现2.1、调用scikit-learn库中KNN算法 3、使用scikit-learn库生成数据集3.1、自定义函数划分数据集3.2、使用scikit-learn库划分数据集 4、使用scikit-learn库对鸢尾花数据集进行分类5、什么是超参数5.1、实现寻找超参数5.2、使用scikit-lea…

【vite】

目录 vite介绍vite的基础应用vite创建项目vite创建vue3项目vite创建vue2项目vite创建react项目 vite中使用css的各种功能vite中使用ts vite介绍 一、特点&#xff1a; 开发时效率极高开箱即用&#xff0c;功能完备摄取丰富&#xff0c;兼容rollup超高速热重载预设应用和类库打…

vulhub中 Struts2-015 远程代码执行漏洞复现

影响版本: 2.0.0 - 2.3.14.2 ## 原理与测试 漏洞产生于配置了 Action 通配符 *&#xff0c;并将其作为动态值时&#xff0c;解析时会将其内容执行 OGNL 表达式&#xff0c;例如&#xff1a; xml <package name"S2-015" extends"struts-default"> …

上位机图像处理和嵌入式模块部署(qmacvisual之n点标定)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 工业场景中&#xff0c;很多时候图像是用来做测量的。虽然我们很希望载台是平的&#xff0c;摄像头是正对着拍摄物体的&#xff0c;但是运行时间长…

可视化图表:象形柱图,比柱图漂亮、有趣100倍。

一、什么是象形柱图 象形柱图&#xff08;Pictorial Bar Chart&#xff09;是一种可视化图表&#xff0c;它使用图形或图片代替传统的矩形柱子来表示数据。每个图形或图片的大小和形状都与对应的数据值相关联&#xff0c;从而形成一种视觉上的象征性表示。 象形柱图通常用于展…

【每日刷题】Day3

【每日刷题】Day3 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; 目录 1. 69. x 的平方根 - 力扣&#xff08;LeetCode&#xff09; 2. 70. 爬楼梯 - 力扣&#xff08;LeetCode&#xff09; 3. 118. 杨辉三…

STL容器(3)

1,stack容器 1.1 基本概念 概念&#xff1a;stack是一种先进后出的数据结构&#xff0c;它只有一个出口 因此&#xff1a; 栈中只有顶端的元素才可以被使用&#xff0c;因此占不允许有遍历行为 栈中进入数据称为--入栈&#xff08;push) 栈中弹出数据称为--出栈&#xff08…