Node.js笔记(九)Nodejs与shell

众所周知,Nodejs是单进程异步运行的,但不光是单进程,Nodejs也提供了多进程方面的支持

其创始人应该还是比较重视这一块的,最有力的证据就是child_process是Nodejs核心模块之一

大多数情况下应该用不到这个模块,但child_process却能做很多有意思的事情

shell调用

最近用到的比较实用的功能,在做大数据处理的时候,需要根据客户在页面上的点击转化为spark集群的命令

spark是用scala写的,跟Nodejs半点关系都没有

考虑了一段时间后,决定用shell来解决

shell脚本基础

shell其实很简单,你在控制台输个cd desktop然后回车,这就是最简单的shell指令,

把这行指令写在文本里,就是shell脚本了

例如:

test.sh

#!bin/bash
spark-submit test.jar para1 para2......

在*nix系统下可以使用命令

sh test.sh 

来执行这个脚本,效果跟直接敲命令

spark-submit test.jar para1 para2......

是一样的

Nodejs的execfile方法

原型如下:

child_process.execFile(file, args, options, callback)
说明:
file {String} 要运行的程序的文件名
args {Array} 字符串参数列表
options {Object}
cwd {String} 子进程的当前工作目录
env {Object} 环境变量键值对
encoding {String} 编码(缺省为 ‘utf8‘)
timeout {Number} 超时(缺省为 0)
maxBuffer {Number} 最大缓冲(缺省为 200*1024)
killSignal {String} 结束信号(缺省为 ‘SIGTERM‘)
callback {Function} 进程结束时回调并带上输出
error {Error}
stdout {Buffer}
stderr {Buffer}
返回:ChildProcess 对象

使用也很简单,值得注意的有三点

  1. timeout
  2. stdout
  3. stderr

用shell的方式来实现这种跨语言调用通常被认为是不稳定的,

linux的exec命令执行后,原有进程会被替换成新的进程,进而失去对新进程的控制

初次之外,还有shell出错,因为各种原因卡死等情况

Nodejs提供了比较好的解决方案,timeout解决了卡死的问题

stdout和stderr则提供了标准输出和错误输出,使得子进程的状态可以被获取

具体使用方法如下:

var call_sh = require(‘child_process‘);
//para是json格式的数组,由post得到
function callsh(file,para){
    call_sh.execFile(file,[para.attr1,para.attr2],function (error, stdout, stderr) {
    console.log(‘stdout: ‘ + stdout);
    console.log(‘stderr: ‘ + stderr);
    if (error !== null) {
      console.log(‘exec error: ‘ + error);
    }
    });
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 13:23:56

Node.js笔记(九)Nodejs与shell的相关文章

[转载] Node.js 笔记(一) nodejs、npm、express安装

感谢原作者: http://blog.csdn.net/haidaochen/article/details/7257655 Windows平台下的node.js安装 直接去nodejs的官网http://nodejs.org/上下载nodejs安装程序,双击安装就可以了 测试安装是否成功: 在命令行输入 node –v 应该可以查看到当前安装的nodejs版本号 简单的例子写一段简短的代码,保存为helloworld.js,大致看下nodejs是怎么用的. 如下:该代码主要是创建一个http服

Node.js笔记(一)

=============node.js  note ========================== 1 NodeJS是一个服务器端JavaScript解释器        apt-get install node node.js 的安装学习请查看下列url:http://www.runoob.com/nodejs/nodejs-install-setup.html  +++++++++++++node.js 安装+++++++++++++++  +安装:  +     sudo apt-

Node.js笔记(0003)---Express框架Router模块学习笔记

这段时间一直有在看Express框架的API,最近刚看到Router,以下是我认为需要注意的地方: Router模块中有一个param方法,刚开始看得有点模糊,官网大概是这么描述的: Map logic to route parameters. 大概意思就是路由参数的映射逻辑 这个可能一时半会也不明白其作用,尤其是不知道get和param的执行顺序 再看看源码里面的介绍: Map the given param placeholder `name`(s) to the given callbac

node.js笔记——模块的开发

模块是什么? 简单来说模块是用来将实现某个功能的代码进行封装以便在其他项目中通过简单引入的方式实现模块中封装的功能的一个东西!!(我更想管他叫小程序). 模块的引入 模块的引入使用reqiure()函数来实现例如引入http模块 var h = require("http"); 这里需要注意的是require()加载函数可以加载指定的js文件,当引入的不是某个js文件而是一段没有扩展名的字符时,默认node.js会加载当前根目录下的node_modules文件夹下面的文件夹里的文件 并

node.js笔记——文件之间的引入

node.js的基础语法就是JavaScript的语法,所以对于懂得javascript的同学来说要容易一些,至于环境的配置也要相对简单很多,可以访问官方文档进行安装.这里分享一下我在学习中总结的一些东西,这是第一篇先来说说文件之间如何进行引入并互相使用变量及函数. 码缘»node.js笔记——文件之间的引入 http://www.ithome.ren/2017/05/31/node-js1.html

Node.js笔记(0001)---connect模块

首先来看这一部分代码 1 /** 2 * Created by bsn on 14-7-1. 3 */ 4 var connect = require('connect'); 5 6 var app = connect(); 7 function hello(req, res, next) { 8 console.log(req.url); 9 res.end('hello bsn'); 10 next(); 11 } 12 13 function helloAgain(req, res) {

Node.js 笔记(一) nodejs、npm、express安装(转)

转载地址:http://blog.csdn.net/haidaochen/article/details/7257655 Windows平台下的node.js安装 直接去nodejs的官网http://nodejs.org/上下载nodejs安装程序,双击安装就可以了 测试安装是否成功: 在命令行输入 node –v 应该可以查看到当前安装的nodejs版本号 简单的例子写一段简短的代码,保存为helloworld.js,大致看下nodejs是怎么用的. 如下:该代码主要是创建一个http服务器

node.js 笔记

安装nodejs nodejs.org Node.js for Mac 安装 安装npm curl http://npmjs.org/install.sh | sh 更新npm sudo npm update npm -g 安装 PM2 npm install pm2 -g 更新PM2 pm2 update 安装 express $ npm install -g express-generator #需先安装express-generator   $ npm install -g express

Node.js笔记--(一)、安装

一.下载安装node.js https://nodejs.org/download/ 双击运行安装(默认安装地址:C:\Program Files\nodejs或者C:\Program Files(×86)\nodejs) 双击运行安装(默认安装地址:C:\Program Files\nodejs或者C:\Program Files(×86)\nodejs) 二.运行cmd.exe C:\Users\Administrator>npm -v 如果报错: 更改系统环境变量:增加npm的安装路径:前

Node.js笔记(二)

===============note two====================  node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件,一个fs.readStream对象会在文件被打开的时候发出一个事件.所有这些产生事件的对象都是events.EventEnitter的实例. events 模块只提供了一个对象: events.EventEmitter.EventEmitter 的核心就是事件触发与事件监听器功能的封装. 你可以通过requ