Node学习记录-child_process 子进程

news2024/12/18 13:28:05

来自:https://juejin.cn/post/7277045020422930488
child_process用于处理CPU密集型应用,Nodejs创建子进程有7个API,其中带Async的是同步API,不带的是异步API

child_process.exec(command[, options][, callback])

command:要运行的命令,参数以空格分隔
options: 配置项
cwd: 子进程的当前工作目录
env: 环境变量键值对
encoding:默认值: ‘utf8’
shell:用于执行命令的shell,在UNIX上默认为’/bin/sh’,在Windows上默认为process.env.ComSpec
timeout:默认是0
maxBuffer:标准输出或者标准错误上允许的最大数据量(单位: 字节),如果超过子进程将终止并截断任何输出,默认值:1024 * 1024
killSignal: 默认为’SIGIERM’
uid: 设置进程的用户身份
gid:设置进程的组标识
windowsHide:隐藏通常在Windows系统上创建的子进程控制台窗口
callback:当进程终止时调用输出

const { exec, } = require('child_process')
exec('node -v',(err,stdout,stderr)=>{
    if(err){
        return  err
    }
    console.log(stdout.toString())//打印出node版本号
 })

child_process.execSync(command[, options])

command:要运行的命令。
options: 配置项,比上面多了stdio,input
stdio:子进程的标准输入输出配置,除非指定stdio,默认情况下stderr将输出的父进程的标准错误,默认值pipe
获取node版本号,如果要执行单次shell命令execSync方便一些

const { exec, spawn, execSync } = require('child_process')
const nodeVersion  = execSync('node -v')
console.log(nodeVersion.toString("utf-8"))

打开谷歌浏览器,并打开百度无痕浏览模式

execSync("start chrome http://www.baidu.com --incognito")

child_process.execFile(file[, args][, options][, callback])

适合执行可执行文件,如一个node脚本或者shell文件
file:要允许可执行文件的路径或文件名
args: 字符串参数列表
options:配置项,比上面多了windowsVerbatimArguments
windowsVerbatimArguments: 在Windows上不为参数加引号或转义,在Unix上被忽略,默认是false
新建bat.cmd脚本

echo '开始'
mkdir test
cd ./test
echo console.log('testdddd') >test.js
echo '结束'
node test.js

execFile执行这个脚本

const { execFile } = require('child_process')
const path = require('path')
execFile(path.resolve(process.cwd(), './bat.cmd'), null, (err,stdout) =>{
    console.log(stdout.toString())
})

在这里插入图片描述
生成文件
在这里插入图片描述

child_process.spawn()

用于创建一个子进程,并执行指定的程序
spawn用于执行一些实时获取的信息,因为spawn返回的是流,边执行边返回,exec是返回一个完整的buffer,buffer的大小是200K,如果超出会报错,而spawn是无上限的
spawn在执行完成后会抛出close事件监听,并返回状态码,通过状态码可以知道子进程是否顺利执行,exec只能通过返回buffer去识别完成状态,识别起来较为麻烦
启动一个 ls -lh /usr 的子进程,并监听其 stdout, stderr 和 close 事件,然后分别打印这些事件的数据或状态。

const { spawn } = require('child_process')
// 创建一个子进程 ls 并执行了 ls 命令,同时传入了 -lh 和 /usr 这两个参数。-lh 参数让 ls 命令以人类可读的格式列出文件大小,并且以长格式显示文件信息。/usr 是要列出目录的内容。
const ls = spawn('ls',['-lh', '/usr'])
// 当子进程有输出数据到标准输出流 (stdout) 时的处理函数。每当有数据从 ls 命令的标准输出流中流出,就会触发这个事件处理器,并打印出相应的数据
ls.stdout.on('data', (data) =>{
    console.log(`stdout: ${data}`)
})
// 当子进程有输出数据到标准错误流 (stderr) 时的处理函数。每当有数据从 ls 命令的标准错误流中流出,就会触发这个事件处理器,并打印出相应的数据。
ls.stderr.on('data', (data) =>{
    console.log(`stderr: ${data}`)
})
// 当子进程结束时的处理函数。close 事件在子进程完全关闭后被触发,并提供退出码作为参数
ls.on('close', (code) =>{
    console.log(`child process exited with code ${code}`)
})

child_process.fork(modulePath[, args][, options])

还是看文档吧(https://nodejs.cn/api/child_process.html#child_processforkmodulepath-args-options)
fork 函数允许你在当前 Node.js 进程中创建一个新的子进程,并且这个子进程运行的是 Node.js 脚本

modulePath:要在子进程中运行的模块
args:字符串参数列表
options:配置项
options

cwd | 子进程的当前工作目录。

detached 准备子进程独立于其父进程运行。具体行为取决于平台,参见 options.detached。

env 环境变量键值对。默认值:process.env。

execPath 用于创建子进程的可执行文件。

execArgv <string[]> 传给可执行文件的字符串参数列表。默认值:process.execArgv。

gid 设置进程的组标识(请参阅 setgid(2))。

serialization 指定用于在进程之间发送消息的序列化类型。可能的值为 ‘json’ 和 ‘advanced’。有关详细信息,请参阅 高级序列化。默认值:‘json’。

signal 允许使用中止信号关闭子进程。

killSignal | 当衍生的进程将被超时或中止信号杀死时要使用的信号值。默认值:‘SIGTERM’。

silent 如果为 true,则子进程的标准输入、标准输出和标准错误将通过管道传输到父进程,否则它们将从父进程继承,有关详细信息,请参阅 child_process.spawn() 的 stdio 的 ‘pipe’ 和 ‘inherit’ 选项。默认值:false。

stdio | 参见 child_process.spawn() 的 stdio。提供此选项时,它会覆盖 silent。如果使用数组变体,则它必须恰好包含一个值为 ‘ipc’ 的条目,否则将抛出错误。例如 [0, 1, 2, ‘ipc’]。

uid 设置进程的用户身份(请参阅 setuid(2))。

windowsVerbatimArguments 在 Windows 上不为参数加上引号或转义。在 Unix 上被忽略。默认值:false。

timeout 允许进程运行的最长时间(以毫秒为单位)。默认值:undefined。

const { fork } = require('child_process')
// 创建一个新的子进程,这个子进程会执行名为 child.js 的脚本文件。child.js 应该位于当前工作目录下或路径明确指向的位置
const childProcess = fork('child.js')
// 向子进程发送了一条消息。send 方法允许主进程向子进程发送任意的消息数据。这里发送的消息内容是 'hi 我是主进程'
childProcess.send('hi 我是主进程')
// 设置了一个事件监听器,监听来自子进程的消息。当子进程通过 process.send() 方法发送消息给主进程时,会触发这个监听器,并执行回调函数
childProcess.on("message", (data) =>{
    // 当子进程发送消息给主进程时,这个回调函数会被调用,并打印接收到的消息内容
    console.log('我是主进程接收消息:', data)
})

被子进程执行的脚本, 该子进程独立于父进程,除了两者之间建立的 IPC 通信通道。每个进程都有自己的内存,具有自己的 V8 实例。由于需要额外的资源分配,关于IPC通信可以看这个: https://zhuanlan.zhihu.com/p/465574868

// 注册了一个事件监听器,用于监听 message 事件。每当子进程从父进程那里接收到消息时,这个监听器就会被触发,并执行提供的回调函数。
process.on('message', data =>{
    console.log('子进程接收消息:',data)
})
// 向父进程发送一条消息。消息内容是 '我是子进程'process.send() 方法允许子进程向父进程发送数据
process.send('我是子进程')

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

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

相关文章

NVR批量管理软件/平台EasyNVR多个NVR同时管理支持对接阿里云、腾讯云、天翼云、亚马逊S3云存储

随着云计算技术的日益成熟&#xff0c;越来越多的企业开始将其业务迁移到云端&#xff0c;以享受更为灵活、高效且经济的服务模式。在视频监控领域&#xff0c;云存储因其强大的数据处理能力和弹性扩展性&#xff0c;成为视频数据存储的理想选择。NVR批量管理软件/平台EasyNVR&…

2024年编程语言排行榜:技术世界的新星与常青树

随着技术的不断进步&#xff0c;编程语言的流行度也在不断变化。今天&#xff0c;就让我们一起来看看2024年的编程语言排行榜&#xff0c;探索哪些语言在技术世界中占据了主导地位。 1. Python&#xff1a;稳居榜首 Python以其在人工智能、数据科学、网络开发等多个领域的广泛…

MFC工控项目实例二十八模拟量信号每秒采集100次

采用两个多媒体定时器&#xff0c;一个0.1秒计时,另一个用来对模拟量信号采集每秒100次.。 1、在SEAL_PRESSUREDlg.h中添加代码 class CSEAL_PRESSUREDlg : public CDialog { public:CSEAL_PRESSUREDlg(CWnd* pParent NULL); // standard constructor&#xff0e;&#xff0e…

基于MoviNet检测视频中危险暴力行为

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【Faster & Mask R-CNN模型实现啤酒瓶瑕疵检测】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生…

ArcGIS003:ArcMap常用操作0-50例动图演示

摘要&#xff1a;本文以动图形式介绍了ArcMap软件的基本操作&#xff0c;包括快捷方式创建、管理许可服务、操作界面元素&#xff08;如内容列表、目录树、搜索窗口、工具箱、Python窗口、模型构建器窗口等&#xff09;的打开与关闭、位置调整及合并&#xff0c;设置默认工作目…

NVR批量管理软件/平台EasyNVR多个NVR同时管理支持视频投放在电视墙上

在当今智能化、数字化的时代&#xff0c;视频监控已经成为各行各业不可或缺的一部分&#xff0c;无论是公共安全、交通管理、企业监控还是智慧城市建设&#xff0c;都离不开高效、稳定的视频监控系统的支持。而在这些应用场景中&#xff0c;将监控视频实时投放到大屏幕电视墙上…

asp.net core 跨域配置不起作用的原因

1、中间件配置跨域的顺序不对 中间件顺序配置对了基本上就能解决大部分问题中间件顺序配置对了基本上就能解决大部分问题 附上官网简单的启用跨域的代码 var MyAllowSpecificOrigins "_myAllowSpecificOrigins";var builder WebApplication.CreateBuilder(args);…

Linux 命令解释器-shell

概念 shell &#xff1a;壳&#xff0c;命令解释器&#xff0c;负责解析用户输入的命令 分类&#xff1a; 内置命令 (shell 内置 ) &#xff0c; shell 为了完成自我管理和基本的管理&#xff0c;不同的 shell 内置不同的命令&#xff0c;但是大 部分都差不多 外置命令&…

【开源免费】基于SpringBoot+Vue.JS网上超市系统(JAVA毕业设计)

本文项目编号 T 037 &#xff0c;文末自助获取源码 \color{red}{T037&#xff0c;文末自助获取源码} T037&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

apisix高性能网关实现一机一密

基于 APISIX 的一机一密实现方案 概述 基于 Apache APISIX 网关的一机一密实现方案&#xff0c;通过自主开发的自定义插件实现设备级别的密钥管理和加密通信。本方案通过扩展 APISIX 的插件机制&#xff0c;实现高可用、可扩展的 API 安全防护。 本方案的主要特点&#xff1a; …

嵌入式Linux的AXI平台(platform)驱动教程

本文以JFMQL100的Linux系统的AXI接口的平台驱动为例&#xff0c;介绍嵌入式Linux的平台驱动编写、测试软件编写以及验证方式。本文的方法适用于任意嵌入式芯片Linux的物理地址映射的平台&#xff08;platform&#xff09;驱动的编写、测试与应用。 本文中AXI的开始地址为0x8000…

Visual Studio Code(VSCode)中编写 TypeScript 代码

在 Visual Studio Code&#xff08;VSCode&#xff09;中编写 TypeScript 代码通常需要以下配置&#xff1a; 一、安装必要的扩展 TypeScript 插件&#xff1a;由微软官方提供&#xff0c;提供了语法高亮、错误检查、代码补全等功能。 二、配置 tsconfig.json 文件&#xff08;…

视频设备一体化监控运维方案

随着平安城市、雪亮工程等项目建设的号召&#xff0c;视频监控系统的建设如火如荼地开展。无论在公共场所、企业单位、住宅小区、矿山工地还是交通枢纽&#xff0c;视频监控系统已成为保障安全、维护秩序和提升管理效率的重要工具。但由于对视频监控系统中的前端设备&#xff0…

第十八章 Vue组件样式范围配置之scoped

目录 一、引言 二、案例演示 2.1. 工程结构图 2.2. 核心代码 2.2.1. main.js 2.2.2. App.vue 2.2.3. BaseOne.vue 2.2.4. BaseTwo.vue 2.3. 运行效果 2.4. 调整代码 2.4.1. BaseTwo.vue 2.4.2. 运行效果 三、scoped原理 一、引言 前面的几个章节在介绍组件的时…

可口可乐三季报 | 数字化助力,营收超预期 | ​eBest

可口可乐公司近日公布了2024年第三季度业绩报告。报告特别强调了数字技术&#xff0c;尤其是AI人工智能对推动增长的重要作用。 第三季度&#xff0c;可口可乐公司交出了一份亮眼的成绩单&#xff0c;营收和每股收益均超出市场预期&#xff0c;显示出公司业务的强大韧性和长期…

书生大模型实战营 L0 入门岛

书生大模型训练营入门岛任务——训练营链接 1. Linux前置知识 任务&#xff1a;端口转发 当使用vscode远程连接服务器时&#xff0c;在服务器运行的任务&#xff0c;vscode会自动帮忙进行端口映射&#xff0c;方便本地进行访问。 2. Python前置知识 任务1&#xff1a;Leec…

配置mysql 主主模式 GTID

文章目录 一、前提二、修改my.cnf主1 10.255.131.9主2 10.255.131.10 三、配置主主3.1 配置主 10.255.131.93.2 配置从 10.255.131.103.3 配置主 10.255.131.103.4 配置从 10.255.131.9 四、验证五、同步问题排查以及恢复5.1 查看同步状态5.2 查看同步是否数据一致性&#xff0…

【Vulnhub靶场】DC-5

DC-5靶机下载地址&#xff1a; https://download.vulnhub.com/dc/DC-5.zip 目标 本机IP&#xff1a;192.168.118.128 靶机IP&#xff1a;192.168.118.0/24 信息收集 扫描存活主机&#xff0c;扫描端口&#xff0c;扫描服务 第一步使用nmap扫描出目标IP为&#xff1a;192.168…

docker 安装kuboard

mkdir /root/kuboard-data docker run --restartunless-stopped -p 8453:80 -d --name kuboard -e KUBOARD_AGENT_SERVER_TCP_PORT8453 -e KUBOARD_ENDPOINThttps://192.168.31.177 -v /root/kuboard-data:/data eipwork/kuboard:v3http://192.168.31.177:8453/ 默认账号&…

SpringBoot和弦:创建Web音乐网站指南

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理音乐网站的相关信息成为必然。开发合适的音…