NodeJs内置模块child_process

内置模块child_process子进程

写在前面

子进程是Nodejs的核心Api,如果你会shell命令,它会有非常大的帮助,或者你喜欢编写前端工程化工具之类,它也有很大的用处,以及处理CPU密集型应用。

创建子进程

Nodejs创建子进程共有7个API,带Sync的是同步API,不加的是异步API:

  1. spwan:执行命令
  2. exec:执行命令
  3. execFile:执行可执行文件
  4. fork:创建node子命令
  5. execSync:执行命令 同步执行
  6. execFileSync:执行可执行文件 同步执行
  7. spawnSync:执行命令 同步执行

1. exec()和execSync()

exec()异步的方法 可以帮我们执行shell命令 或者跟软件交互 回调函数返回一个buffer。

我们首先介绍exec()execSync()命令的第一个用途:执行shell命令

我们尝试使用exec()执行shell命令输出node版本

const { exec } = require("child_process");
exec("node -v", (err, stdout, stderr) => {if (err) {console.log(err);return;}// 返回的是buffer 转成字符后输出console.log("exec", stdout.toString()); // v16.17.0
});

execSync() 同步的方法 一般同步的用的比较多 异步写法太麻烦了。

这两种方法都比较适合执行较小的shell命令 想要立马拿到结果的shell命令

但是这两种方法有个缺点:返回的字节上限200kb 超出就会报错

使用execSync()执行shell命令输出node版本

const { execSync } = require("child_process");
const nodeVersion = execSync("node -v");
console.log("execSync", nodeVersion.toString()); // v16.17.0

使用execSync()创建文件夹test:因为mkdir命令没有返回值,因此不用接收结果

execSync("mkdir test");  // 可以看到当前目录中多了一个test文件夹

下面我们再介绍exec()execSync()命令的第二个用途:跟软件交互

这里就以execSync()为例,尝试打开chrome的百度页面:

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

运行此代码可以成功百度页,下面我们再试试使用execSync()启动电脑上的steam,我们需拿到steam运行程序的路径:

execSync("D:\\Steam\\Steam.exe");

运行代码后等待一会【启动应用程序需要时间】可以看到steam成功启动,需要注意的是:commonjs规范下路径需要双反斜杠进行转码。

2. spawn()和spawnSync()

spawn()spawnSync()也是用来执行shell命令,并且返回的字节大小没有上限 因为返回的是个流 并且是实时返回的,而exec()execSync()需要等待shell命令运行结束,拿到所有的返回结果的才算结束。

spawnSync()用的比较少。

这里我们扩展一下netStat的相关知识:

shell命令netStat是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。

在这里插入图片描述

下面我们先使用execSync()执行shell命令netStat获取本机网络状态。

const { execSync } = require("child_process");
const netstat = execSync("netstat");
console.log(netstat.toString());  // 需要等待运行完才输出

在这里插入图片描述

可以看到网络状态并不会实时的一条一条的输出,下面我们使用spawn()执行shell命令netStat获取本机网络状态。

spwan()的用法和exec()差异不小,它需要从返回结果中解构出stdout,并使用on监听返回的数据,并且每一条数据都是buffer类型,需要转字符输出才能看得懂,另外,spwan()不仅能实时输出运行结果,使用on还能监听命令运行结束,这是exec所不具有的。

const { spawn } = require("child_process");
const { stdout } = spawn("netstat");
stdout.on("data", (data) => {console.log(data.toString());
});
stdout.on("close", () => {console.log("结束了");
});

在这里插入图片描述

可以看到控制台实时输出了每一个网络的当前状态。

增加shell命令参数的格式和exec()不同,exec()是直接在shell命令后面增加,就和在命令行输入一样,spawn()增加shell命令参数的格式如下:

const { spawn } = require("child_process");
const { stdout } = spawn("netstat", ["-a"]);  // 增加shell命令参数
stdout.on("data", (data) => {console.log(data.toString());
});
stdout.on("close", () => {console.log("结束了");
});

3. 未完待补充

参考博客:

  1. https://xiaoman.blog.csdn.net/article/details/132797154?spm=1001.2014.3001.5502
  2. https://blog.csdn.net/weixin_44299027/article/details/123741176

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

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

相关文章

linux 安装mysql

1、下载mysql安装包 2、创建mysql文件夹 mkdir /usr/local/mysql 3、解压mysql安装包,并将解压出来的文件夹下面的内容全部移动到/usr/local/mysql下 解压 tar zxvf mysql-5.7.39-linux-glibc2.12-x86_64.tar.gz 移动 mv /usr/local/src/mysql-5.7.39-linux-gl…

企业服务器租用对性能有什么要求呢?

企业租用服务器租用首要的是稳定,其次是安全,稳定是为了让企业的工作能够顺利进行,只有性能稳定的服务器才能保证网站之类的正常工作,就让小编带大家看一看有什么要求吧! 服务器简单介绍。服务器是在网络上为其它客户机…

如何实现制造业信息化转型?

一、制造业信息化历史 (1)1930年代 库存控制、管理 当时计算机系统尚未出现,人们为了解决库存管控的难题,提出了订货点法——当库存量降低到某一预先设定的点时,即开始发出订货单补充库存,直至库存量降低…

zabbix监控项

一、监控项(items) 1、获取监控数据的方式: ① zabbix-agent:代理程序是在被监控主机上运行的软件,负责收集和报告有关主机性能和状态的数据,监控系统通过与代理程序通信来获取数据。 ② SNMP&#xff1…

低功耗蓝牙(BLE)开发——Qt

背景知识 低功耗蓝牙比经典蓝牙复杂些,需要了解一些协议的基础知识。 此部分参考博客GATT Profile 简介-CSDN博客 GATT详细介绍-CSDN博客 Introduction | Introduction to Bluetooth Low Energy | Adafruit Learning System 蓝牙 (四) GATT profile-CSDN博客 关…

应用商店优化的好处有哪些?

应用程序优化优势包括应用在商店的可见性和曝光度,高质量和被相关用户的更好发现,增加的应用下载量,降低用户获取成本和持续增长,增加应用收入和转化率以及全球受众范围。 1、提高知名度并在应用商店中脱颖而出。 如果用户找不到…

Zero-Copy零拷贝

零拷贝不是0次拷贝,是内核缓存区到应用缓存区0次拷贝 参考文章 Linux 中的零拷贝机制

缓存的力量:提升API性能和可扩展性

缓存是将频繁访问的数据或资源存储在临时存储位置(例如内存或磁盘)的过程,以提高检索速度并减少重复处理的需要。 缓存的好处 提高性能:缓存消除了每次从原始源检索数据的需要,从而提高了响应时间并减少了延迟。减少服务器负载:通…

Spring Cloud 2023 新特性 同步网关

网关不支持传统 Servlet 容器 Spring Cloud Gateway 需要运行在提供的 Netty 运行时。它不能在传统的 Servlet 容器中工作,也不能在构建为 WAR 时工作。WebFlux 使用了异步非阻塞的编程模型,相较于传统的 MVC Servlet 需要理解和适应新的编程范式和响应…

leetCode 15.三数之和 双指针解法

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例 1&…

竞赛 深度学习 大数据 股票预测系统 - python lstm

文章目录 0 前言1 课题意义1.1 股票预测主流方法 2 什么是LSTM2.1 循环神经网络2.1 LSTM诞生 2 如何用LSTM做股票预测2.1 算法构建流程2.2 部分代码 3 实现效果3.1 数据3.2 预测结果项目运行展示开发环境数据获取 最后 0 前言 🔥 优质竞赛项目系列,今天…