Node.js笔记(九)Nodejs与shell

时间:2021-07-08 21:59:51

众所周知,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);
    }
    });
}