Node.js执行系统命令
原文发表在我的博客 Node.js 执行系统命令 | 以太空间
我们在使用Node.js的时候总有一些时候需要执行一些系统命令,与系统做一些交互,或者调用其他语言,这个时候该怎么做呢? 当然是使用child_process
模块了,这个模块翻译过来就是子进程,当然正如其名,这个模块主要是通过产生子进程来发挥作用,下面我们就用实例来看一下。
一、exec
与execSync
这是child_process
模块里面最简单的函数,作用就是执行一个固定的系统命令
const { exec } = require('child_process');
// 输出当前目录(不一定是代码所在的目录)下的文件和文件夹
exec('ls -l', (err, stdout, stderr) => {if(err) {console.log(err);return;}console.log(`stdout: ${stdout}`);console.log(`stderr: ${stderr}`);
})
复制代码
exec
函数第一个参数是要执行的命令,的第二个函数是配置选项,第三个参数是回调函数,第二个参数中一个比较常用的就是子进程的工作目录
const { exec } = require('child_process');
const path = require('path'):
// 在当前目录下的scripts文件夹里执行hexo g命令
exec('hexo g', { cwd: path.join(process.cwd(), 'scripts') }, (err, stdout, stderr) => {if(err) {console.log(err);return;}console.log(`stdout: ${stdout}`);
});
复制代码
execSync
是exec
的同步版本,不过无论是execSync
还是exec
,得到的结果都是字符串或者Buffer对象,一般需要进一步处理。
请参考:
exec
具体配置,execSync
具体配置
二、execFile
与execFileSync
这两个函数的作用是执行一个可执行文件,看下面的实例:
const { execFile, execFileSync } = require('child_process');execFile('example.py', [], (err, stdout, stderr) => {if(err) {console.log(err);return;}console.log(`stdout: ${stdout}`);
});const stdout = execFileSync('node', ['-v']);
console.log(stdout);
复制代码
跟exec
类似,第一个参数是要执行的文件路径,第二个是参数数组,第三个是配置,第四个是回调函数,当然,除了第一个之外都是可以省略的
注意:被执行的文件一定要有可执行权限,如果是类似
.py
类的特定语言的脚本,一定在开头指定解释器程序路径
请参考:execFile配置,execFileSync配置
三、spawn
与spawnSync
child_process
模块中所有函数都是基于spawn
和spawnSync
函数的来实现的,换句话来说,spawn
和spawnSync
函数的配置是最完全的,其它函数都是对其做了封装和修改。下面我们来重点讲解一下: spawn
函数原型是这样的:child_process.spawn(command[, args][, options])
它使用指定的命令行参数创建新进程,spawn 会返回一个带有stdout和stderr流的对象。你可以通过stdout流来读取子进程返回给Node.js的数据。stdout拥有'data'
,'end'
以及一般流所具有的事件。当你想要子进程返回大量数据给Node时,比如说图像处理,读取二进制数据等等,你最好使用spawn方法
const {spawn} = require('child_process');
const fs = require('fs');
const spawnObj = spawn('ping', ['127.0.0.1'], {encoding: 'utf-8'});
spawnObj.stdout.on('data', function(chunk) {console.log(chunk.toString());
});
spawnObj.stderr.on('data', (data) => {console.log(data);
});
spawnObj.on('close', function(code) {console.log('close code : ' + code);
})
spawnObj.on('exit', (code) => {console.log('exit code : ' + code);fs.close(fd, function(err) {if(err) {console.error(err);}});
});
复制代码
Node.js执行系统命令相关推荐
- Node.js 执行webpack命令出现的错误
安装 npm install webpack-cli -g 全局安装 webpack-cli 模块 安装 npm install webpack --save-dev 项目中安装以上两个模块后使用 w ...
- node.js 执行php,node.js - 如何利用php执行nodejs文件
如何利用php 的exec执行nodejs文件? 如下执行却执行失败 public function execTask ($dirPath) { $serverPath = self::$server ...
- nodejs 运行linux命令,node.js执行shell命令
史上最详细的iOS之事件的传递和响应机制 前言: 按照时间顺序,事件的生命周期是这样的: 事件的产生和传递(事件如何从父控件传递到子控件并寻找到最合适的view.寻找最合适的view的底层实现.拦截事 ...
- node.js mysql防注入_避免Node.js中的命令行注入安全漏洞
在这篇文章中,我们将学习正确使用Node.js调用系统命令的方法,以避免常见的命令行注入漏洞. 我们经常使用的调用命令的方法是最简单的child_process.exec.它有很一个简单的使用模式;通 ...
- 关于node.js的误会
昨天写了篇博客,介绍了一下我对node.js的第一次亲密接触后的感受,以为node.js很小众,出乎我意料很多人感兴趣,并且对博客中的细节问题做了评论,最多的是围绕node.js的异步与单线程展开的, ...
- Linux事件循环阻塞,深入浅析Node.js 事件循环、定时器和process.nextTick()
什么是事件循环 尽管JavaScript是单线程的,但通过尽可能将操作放到系统内核执行,事件循环允许Node.js执行非阻塞I/O操作. 由于现代大多数内核都是多线程的,因此它们可以处理在后台执行的多 ...
- Node.js的3m安装法
原文地址:https://cnodejs.org/topic/57f628098489e7ca69f4e839 安装Node.js Node.js是支持多个平台,Mac.Linux以及Windows, ...
- 6分钟看懂 Node.js 武功精髓
本篇来自[北妈的小北鼻]写手联盟 小北鼻作者:闹闹 阅读大约需要6分钟 1 为什么要学习Node.js? Node.js是目前非常火热的技术,可是作为一个前端开发人员,为什么要学Node.js? 说N ...
- Node.js知识梳理之Node.js安装
Node.js官网:nodejs.org/en/ 用户进入官网,会自动推荐适合于开发者电脑的Node.js版本,官网提示我下载适用于windows(x64)的版本.官网有两个版本LTS(长期稳定)版和 ...
最新文章
- Python-字符串操作方法 [转]
- HTML5 文件域+FileReader 读取文件并上传到服务器(三)
- Thinkphp怎样修改模板标签定界符
- 结对第2次作业——WordCount进阶需求
- ERROR 1 (HY000): Can‘t create/write to file ‘/var/www/11.txt‘ (Errcode: 13)报错解决方案
- 关于 SAP UI5 系统测试工具 UIVeri5 的 Chromedriver 版本问题
- Linux 命令之 lsusb -- 显示本机的USB设备列表信息
- 两层卷积网络实现手写字母的识别(基于tensorflow)
- llvm安装方式_安装 LLVM 和 Clang
- Java开发人员常用网站收录
- 中国的房产市场和房产取向
- GENTLE.NET快速上手
- pl/sql 存储过程实例
- 革命炉石传说,Gods Unchained
- Android手机 通过NFC读取二代证
- Linux awk 命令详解
- Android SQLite加密
- 再见迅雷!推荐一个绿色无广告的开源下载工具
- 淘宝,天猫,1688,微店,京东,苏宁,淘特,小红书等30多个平台一键复制商品到拼多多平台(批量上传宝贝详情接口教程)
- IT项目管理 第八章 习题
热门文章
- 计算机行业常见英语,计算机行业常用英语词汇
- android 强制全屏,[Android]设置Activity为全屏显示的两种方法
- 活动目录从入门到精通
- SQL语句来查询今天、昨天、7天内、30天的数据,经典!
- 继承extends、super、this、方法重写overiding、final、代码块_DAY08
- swift 导出测试包(Save for Ad Hoc Deployment)卡在compile bitcode处问题
- 【bzoj3289】 Mato的文件管理
- Linux产生随机数的几种常见方法
- SAP NetWeaver平台介绍
- Modelsim仿真流程