【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.jsprocess.on('message',message=> {console.log('收到父进程的消息:', message);
})process.send({ hello: '我是子进程' });

在这里插入图片描述

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】vector模拟实现

目录 简介:私有成员:迭代器: 无参构造函数:push_back:reserve:resize:push_back: operator[]重载:begin && end:size && capacity:insert:erase:带参构造…

matlab使用教程(35)—求解时滞微分方程(3)

1中立型 DDE 以下示例说明如何使用 ddensd 求解中立型 DDE(时滞微分方程),其中时滞出现在导数项中。此问题最初由 Paul [1] 提出。方程是: 由于该方程在 y ′ 项中存在时滞,因此该方程称为中立型 DDE。如果时滞仅出现…

Python 与机器学习,在服务器使用过程中,常用的 Linux 命令包括哪些?

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 本博客旨在分享在实际开发过程中,开发者需要了解并熟练运用的 Linux 操作系统常用命令。Linux 作为一种操作系统,与 Windows 或 MacOS 并驾齐驱,尤其在服务器和开发环…

使用 RisingWave、NATS JetStream 和 Superset 进行实时物联网监控

在物联网(IoT)背景下,处理实时数据会遇到一些特定的障碍,如边缘计算资源不足、网络条件限制、扩展性存在问题、设备间有多样性差异。要克服这些挑战,需要高效的边缘计算技术、强大的安全措施、标准化协议、可扩展的管理…

spring中各种bean加载顺序

具体加载顺序按照罗列的顺序 XXXAware ApplicationContextAware、EnvironmentAware、BeanFactoryAware、BeanClassLoaderAware 顾名思义,用于获取对应的对象,需要在实体类中声明对应的对象且当前类为普通类能被注入。 InitializingBean void afterProp…

【软件工程】测试规格

1. 引言 1.1简介 本次的测试用例是基于核心代码基本开发完毕,在第一代系统基本正常运行后编写的,主要目的是为了后续开发与维护的便利性。 该文档主要受众为该系统后续开发人员,并且在阅读此文档前最后先阅读本系统的需求文档、概要设计文…

日志、logback、logback.xml --java学习笔记

什么是日志? 好比生活中的日记,可以记录你生活中的点点滴滴程序中的日志,通常就是一个文件,里面记录的是程序运行过程中的各种信息 之前记录日志的方法都是使用输出语句: 这种方法其实并不适合用来记录日志&#xff…

【c++】初阶模版与STL简单介绍

🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好,本篇文章介绍一下模版和对STL进行简单的介绍,后续我们进入对STL的学习! 目录 模版1.泛型编程2.函数模板2.1函数模板的原理2.2模版的实例化…

实验:基于Red Hat Enterprise Linux系统的创建磁盘和磁盘分区(二、三)

目录 一. 实验目的 二. 实验内容 三. 实验设计描述及实验结果 实验二: 1. 为nvme0n2p1设备建立配额属性和文件(EXT) 2. 要求自己名字的用户只能存储不超过200M的文件,总数量不能大于10个 quotacheck [选项] 文件系统 edquota quotaon [选项] 文件系…

某盾滑块拼图验证码增强版

介绍 提示:文章仅供交流学习,严禁用于非法用途,如有不当可联系本人删除 最近某盾新推出了,滑块拼图验证码,如下图所示,这篇文章介绍怎么识别滑块距离相关。 参数attrs 通过GET请求获取的参数attrs, 决…

背包问题---

一、背包模型 有一个体积为V的背包,商店有n个物品,每个物品有一个价值v和体积w,每个物品只能被拿一次,问能够装下物品的最大价值。 这里每一种物品只有两种状态即"拿"或"不拿". 设状态dp[i][j]表示到第i个物品为止,拿的物品总体积为j的情况下的最大价…

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

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

【智能排班系统】基于SpringSecurity实现登录验证、权限验证

文章目录 SpringSecurity介绍sss-security实现依赖工具类Jwt工具JSON响应工具加密工具类 用户上下文用户信息实体类用户上下文 自定义重写自定义无权限的报错自定义密码加密自定义用户类 过滤器登录过滤器权限过滤器 Service登录Service 配置类说明登录验证权限验证IP流量限制 …

C语言第四十弹---预处理(下)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 预处理 1、#和## 1.1 #运算符 1.2、##运算符 2、命名约定 3、#undef 4、命令行定义 5、条件编译 6、头文件的包含 6.1、头文件被包含的方式 6.1.1、本地…

Spark 部署与应用程序交互简单使用说明

文章目录 前言步骤一:下载安装包Spark的目录和文件 步骤二:使用Scala或PySpark Shell本地 shell 运行 步骤3:理解Spark应用中的概念Spark Application and SparkSessionSpark JobsSpark StagesSpark Tasks 转换、立即执行操作和延迟求值窄变换和宽变换 S…

StreamingT2V文本生成视频多模态大模型,即将开源!

1、前言 Picsart人工智能研究所、德克萨斯大学和SHI实验室的研究人员联合推出了StreamingT2V视频模型。通过文本就能直接生成2分钟、1分钟等不同时间,动作一致、连贯、没有卡顿的高质量视频。 虽然StreamingT2V在视频质量、多元化等还无法与Sora媲美,但…

【鹅厂摸鱼日记(一)】(工作篇)认识八大技术架构

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:重生之我在鹅厂摸鱼⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多知识   🔝🔝 认识八大架构 1. 前言2. 架构简介&…

uniapp:小程序腾讯地图程序文件qqmap-wx-jssdk.js 文件一直找不到无法导入

先看问题: 在使用腾讯地图api时无法导入到qqmap-wx-jssdk.js文件 解决方法:1、打开qqmap-wx-jssdk.js最后一行 然后导入:这里是我的路径位置,可以根据自己的路径位置进行更改导入 最后在生命周期函数中输出: 运行效果…

159 Linux C++ 通讯架构实战14,epoll 函数代码实战

ngx_epoll_init函数的调用 //(3.2)ngx_epoll_init函数的调用(要在子进程中执行) //四章,四节 project1.cpp:nginx中创建worker子进程; //nginx中创建worker子进程 //官方nginx ,一个…

为“自研”的KV数据库编写JDBC驱动

一觉醒来,受到梦的启发,自研了一套K/V数据库系统,因为"客户"一直催促我提供数据库的JDBC驱动,无奈之下,只好花费一个上午的时间为用户编写一个。 我们知道,JDBC只定义一系列的接口, 具体的实现需…