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

news2024/11/22 6:20:30

引言

在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开发任务至关重要。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

环信IM集成教程——Web端UIKit快速集成与消息发送

写在前面: 千呼万唤始出来,环信Web端终于出UIKit了!🎉🎉🎉 文档地址:https://doc.easemob.com/uikit/chatuikit/web/chatuikit_overview.html 环信单群聊 UIKit 是基于环信即时通讯云 IM SDK 开…

Docker:探索容器化技术,重塑云计算时代应用交付与管理

一,引言 在云计算时代,随着开发者逐步将应用迁移至云端以减轻硬件管理负担,软件配置与环境一致性问题日益凸显。Docker的横空出世,恰好为软件开发者带来了全新的解决方案,它革新了软件的打包、分发和管理方式&#xff…

聚观早报 | 蔚来推出油车置换补贴;iPhone 16 Pro细节曝光

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 4月02日消息 蔚来推出油车置换补贴 iPhone 16 Pro细节曝光 小米SU7创始版第二轮追加开售 OpenAI将在日本设立办事…

OSPF中配置静态路由实验简述

静态路由协议和OSPF(开放最短路径优先)协议是两种常见的路由协议,它们在路由选择和网络管理方面有一些区别。他们可以共存。 静态路由协议需要手动配置路由表,不会自动适应网络拓扑变化,适用于小型网络或者网络拓扑变化…

图神经网络:处理非欧几里得数据的新视角

目录 1. 引言 2.图数据与图神经网络基础 3.GNN模型详解 4.应用案例 4.1. 社交网络分析 4.2. 化学分子性质预测 5.总结 1. 引言 非欧几里得数据指的是那些不遵循传统欧几里得空间几何规则的数据。在欧几里得空间中,数据点之间的距离和形状可以通过标准的几何度…

书生·浦语大模型(学习笔记-1)

一、大模型的发展 模型与通用人工智能(AGI),大模型通常被视为发展通用人工智能的重要途径。AI研究从专用模型向通用模型转变,在过去的一二十年中,研究重点在于针对特定任务的专用模型。专用模型的已经再多个领域取得显…

试过了,ChatGPT确实不用注册就可以使用了!

看到官网说不用登录也可以直接使用ChatGPT 我们来试一下 直接打开官网 默认是直接进入了chatgpt3.5的聊天界面 之前是默认进的登录页面 聊一下试试 直接回复了,目前属于未登录状态,挺好! 来试下ChatGPT4 跳转到了登录页面 目前来看gpt4还…

时序预测 | Matlab实现CPO-LSTM【24年新算法】冠豪猪优化长短期记忆神经网络时间序列预测

时序预测 | Matlab实现CPO-LSTM【24年新算法】冠豪猪优化长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab实现CPO-LSTM【24年新算法】冠豪猪优化长短期记忆神经网络时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CPO-LSTM【24年新算法】…

【Java+Springboot】----- 通过Idea快速创建SpringBoot项目操作方法

一、第一步: 点击选择【File】->【New】-> 【Project】 最后弹出[new Project]界面。 二、第二步: 1. 选择【Spring Initializr】 2. 然后选择【Project SDK】的版本 3. 然后 Choose Initializr Service URL 选择默认(Default&#x…

OpenCV项目实战-深度学习去阴影-图像去阴影

往期热门博客项目回顾: 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别-3d姿态识别 深度学习小白学习路线 //正文开始! 图…

Python+requests+Pytest+logging+allure+pymysql框架详解

一、框架目录结构 1)tools目录用来放公共方法存储,如发送接口以及读取测试数据的方法,响应断言 数据库断言 前置sql等方法;2)datas目录用例存储接口用例的测试数据,我是用excel来存储的数据,文件数据 图片数据等;3)testcases目录用来存放测试用例,一个python文件对应…

linux删除 buff/cache缓存

1.查看当前内存占用 free -h如图,缓存占用了将近9G,接下来进行清理 释放页缓存 echo 1 > /proc/sys/vm/drop_caches释放dentries和inodes echo 2 > /proc/sys/vm/drop_caches释放所有缓存 echo 3 > /proc/sys/vm/drop_caches再次查看&#…

uniapp创建opendb-city-china Schema文件后,如何导入城市的数据?

1.点击opendb-city-china后面的详情,进入到gitee代码仓库 2.下载如下图所示的data.json文件 3.将本地创建的opendb-city-china.schema.json上传到云端 4.点击导入json 如果直接将data.json导入会报错,如下图所示: 5.将data.json本来的数组对象&#…

物联网行业中,我们如何选择数据库?

在当今数字化潮流中,我们面对的不仅是海量数据,更是时间的涟漪。从生产线的传感器到金融市场的交易记录,时间序列数据成为了理解事物演变和趋势的关键。在面对这样庞大而动态的数据流时,我们需要深入了解一种强大的工具——时序数…

Flutter 开发学习笔记(3):第三方UI库的引入

文章目录 前言初始化程序Icon导入如何导入 Toast消息提示框引入简单封装简单使用 Charts图表导入新建pages文件夹存放page简单代码实现效果 总结 前言 Flutter已经发布了有10年了,生态也算比较完善了。用于安卓程序开发应该是非常的方便。我们这里就接入一些简单的…

经营数据分析怎么做?企业月度经营分析的思路与方法分享

企业经营分析是企业成功的关键之一,无论企业规模大小,都需要通过系统性的数据分析来指导经营决策。这一过程不仅仅是对集团大局数据的简单处理,还包括对市场、客户、生产、财务、运营、项目进展、人效等多个方面数据的全面审视。通过深入分析…

ubuntu-server部署hive-part4-部署hive

参照 https://blog.csdn.net/qq_41946216/article/details/134345137 操作系统版本:ubuntu-server-22.04.3 虚拟机:virtualbox7.0 部署hive 下载上传 下载地址 http://archive.apache.org/dist/hive/ apache-hive-3.1.3-bin.tar.gz 以root用户上传至…

Redis缓存设计与性能优化【缓存和数据库不一致问题,解决方案:1.加过期时间这样可以一段时间后自动刷新 2.分布式的读写锁】

Redis缓存设计与性能优化 缓存与数据库双写不一致 缓存与数据库双写不一致 在大并发下,同时操作数据库与缓存会存在数据不一致性问题 1、双写不一致情况 2、读写并发不一致 解决方案: 1、对于并发几率很小的数据(如个人维度的订单数据、用户数据等)&a…

六自由度Stewart控制系统matlab仿真,带GUI界面

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 六自由度Stewart平台控制系统是一种高精度、高稳定性的运动模拟装置,广泛应用于飞行模拟、汽车驾驶模拟、虚拟现实、精密定位等领域。其工作原理基于Stewart机构&a…

Python网络爬虫(一):HTML/CSS/JavaScript介绍

1 HTML语言 1.1 HTML简介 HTML指的是超文本标记语言:HyperText Markup Language,它不是一门编程语言,而是一种标记语言,即一套标记标签。HTML是纯文本类型的语言,使用HTML编写的网页文件也是标准的文本文件&#xff0c…