NodeJs内置模块child_process

news2024/11/18 2:55:37

内置模块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.coloradmin.cn/o/1082001.html

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

相关文章

如何处理用户输入验证和表单提交?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

PCL点云处理之点云重建为Mesh模型并保存到PLY文件 ---方法二 (二百一十一)

PCL点云处理之点云重建为Mesh模型并保存到PLY文件 ---方法二 (二百一十一) 一、算法介绍二、算法实现1.代码2.效果一、算法介绍 离散点云重建为mesh网格模型,并保存到PLY文件中,用于其他软件打开查看,代码非常简短,复制粘贴即可迅速上手使用,具体参数根据自己的点云数据…

Unity可视化Shader工具ASE介绍——5、ASE快捷键和常用节点介绍

大家好,我是阿赵。   继续介绍Unity可视化Shader插件ASE。这次来说一些常用节点的快捷键,顺便介绍一些常用的节点。   用过UE引擎的朋友可能会发现,ASE的整体用法和UE的材质节点编辑器非常的像,甚至连很多节点的快捷键都和UE的…

【Vue面试题十六】、Vue.observable你有了解过吗?说说看

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:Vue.observable你有了解…

Python笔记;库,包,模块

在Python中库没有官方说法。 是其他地方沿用过来的。 姑且认为他是一个包或多个包的集合。 包里有子包和模块。 模块以.py格式存储。 下图是一个例子,对于Robot包: import math a math.sqrt(9) 等价于 from math import * a sqrt(9) from math im…

【数据库——MySQL(实战项目1)】(2)图书借阅系统——数据库测试、视图以及存储过程

目录 1. 简述2. 数据表 增、删、改 测试2.1 借阅人表2.2 图书表2.3 借阅信息表 3. 功能代码3.1 创建视图显示所有逾期未归还的借阅信息(包括借阅人姓名,借阅人类别,书名,借出日期,应归还日期,逾期时长&…

二叉搜索树--新增节点-力扣 701 题

例题细节二叉搜索树的基础操作-CSDN博客也讲过了&#xff08;put&#xff09;&#xff0c;下面给出递归实现 public TreeNode insertIntoBST(TreeNode node, int val) {//找到空位了if(node null) {return new TreeNode(val);}if(val < node.val) {//一直找到有null的位置…

草柴返利APP如何查询领取天猫内部隐藏优惠券购物拿天猫返利?

草柴返利APP是一种简单、快捷的购物省钱工具&#xff0c;可以帮助你在天猫上查询并领取内部隐藏优惠券&#xff0c;确认收货后拿购物返利。草柴返利APP可以轻松查询到天猫优惠券&#xff0c;让你购物更加方便&#xff0c;享受更多的折扣优惠。 草柴返利APP如何查询领取天猫优惠…

2、使用阿里云镜像加速器提升Docker的资源下载速度

1、注册阿里云账号并登录 https://www.aliyun.com/ 2、进入个人控制台&#xff0c;找到“容器镜像服务” 3、在“容器镜像服务”中找到“镜像加速器” 4、在右侧列表中会显示你的加速器地址&#xff0c;复制地址 5、进入/etc/docker目录&#xff0c;编辑daemon.json&#xff0…

jumpserver如何录入web资产

需要部署远程应用发布机&#xff0c;此机器需新建一台Windows机器&#xff0c;不要加域 本次环境&#xff1a;Windows 2019 server标准版&#xff0c;8U16G 系统设置-远程应用 设置完成后提交。 此发布机上需预先安装openssh&#xff0c;否则jumpserver无法部署应用发布机 …

第二章 进程与线程 二十、死锁的处理策略(预防死锁、避免死锁、死锁的检测和解除)

目录 一、分类 二、预防死锁 1、破坏互斥条件 2、破坏不剥夺条件 3、破坏请求和保持条件 4、破坏循环等待条件 5、总结 三、避免死锁 1、什么是安全序列 2、安全状态和不安全状态 3、银行家算法 &#xff08;1&#xff09;核心思想 &#xff08;2&#xff09;例子 …

【ElasticSearch】使用 Java 客户端 RestClient 实现对文档的查询操作,以及对搜索结果的排序、分页、高亮处理

文章目录 前言&#xff1a;RestClient 查询文档的 RestAPI一、全文检索查询1.1 match_all 查询1.2 match 查询1.3 multi_match 查询 二、精确查询2.1 term 查询2.2 range 查询 三、复合查询&#xff1a;Boolean 查询与 function score 查询的综合案例四、对查询结果的处理4.1 将…

关于Qualifier你要知道的二三事

&#x1f35e; Qualifier注解的作用-定义Bean-指定Bean的名称 Qualifier注解可以区分具有相同类型的多个Bean&#xff0c;用于明确指定要注入的Bean的名称或限定符。通过为要注入的Bean添加 Qualifier注解&#xff0c;你可以告诉Spring应该使用哪个Bean&#xff0c;以解决Spri…

黑马JVM总结(三十一)

&#xff08;1&#xff09;类加载器-概述 启动类加载器-扩展类类加载器-应用程序类加载器 双亲委派模式&#xff1a; 类加载器&#xff0c;加载类的顺序是先依次请问父级有没有加载&#xff0c;没有加载自己才加载&#xff0c;扩展类加载器在getParent的时候为null 以为Boots…

zabbix监控实战1

1、zabbix监控平台部署 重新克隆纯净虚拟机 数据库初始化 修改密码为WHqwerty123 初始化完成 创建zabbix数据库 基础配置和服务启动 访问 2、zabbix添加监控节点 修改字体文件 在客户端 手动添加监控节点 自动添加监控节点 3、zabbix api 自动注册 停掉自动发现 删掉serve…

VMware 下模拟软 RAID 的创建及故障恢复

Author&#xff1a;rab 目录 前言一、创建 RAID1.1 环境1.2 什么是 RAID&#xff1f;1.3 软 RAID 和硬 RAID1.4 如何创建软 RAID&#xff1f; 二、故障模拟与数据恢复2.1 故障模拟2.2 故障恢复 思考&#xff1f; 前言 一块物理硬盘要投入生产使用&#xff0c;一般会经历一下这…

面试经典 150 题 2 —(滑动窗口)— 3. 无重复字符的最长子串

3. 无重复字符的最长子串 方法 class Solution { public:int lengthOfLongestSubstring(string s) {int result 0, length s.length();int start 0, end 0;while(end < length){// 发现有重复字符时&#xff0c;可以直接把左指针移动到第一个重复字符的下一个位置for(i…

Web前端-Vue2+Vue3基础入门到实战项目-Day3(生命周期, 案例-小黑记账清单, 工程化开发入门)

Web前端-Vue2Vue3基础入门到实战项目-Day3 生命周期生命周期 & 生命周期四个阶段生命周期钩子生命周期案例created应用mounted应用 案例 - 小黑记账清单工程化开发入门工程化开发和脚手架项目运行流程index.htmlmain.js 组件化组件注册局部注册全局注册 来源 生命周期 生命…

1312. 序列统计

1312. 序列统计 - AcWing题库 L~R范围可以等同于0~R-L范围 相当于在R-L1个数中选出k个数 令 则变为 相当于在R-Lk个数中选出k个数 需要计算 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \nusing namespace std;t…

Filter(过滤器)Intercerptor(拦截器)

Filter过滤器 顾名思义&#xff0c;Filter可以对请求进行过滤&#xff0c;当浏览器发送请求时&#xff0c;首先先会被Filter进行拦截&#xff0c;Filter可以决定此次拦截是否放行&#xff0c;如果选择放行&#xff0c;放行之后还会返回Filter执行剩下的代码。 使用方法&…