Node.js - SubProcess模块

Node.js - SubProcess模块 首页 / Node.js入门教程 / Node.js - SubProcess模块

Node.js子进程模块提供了以类似于popen(3)的方式生成子进程的函数。

创建子进程的主要方法有三种:

  • child_process.exec()       -  此方法在控制台中运行命令并缓冲输出。
  • child_process.spawn()   -  此方法使用给定命令启动新进程。
  • child_process.fork()        - 此方法是spawn()方法创建子进程的特例。

child_process.exec()

child_process.exec()方法在控制台中运行命令并缓冲输出。

语法:

child_process.exec(command[, options], callback)

参数:

1)command    -  它使用空格分隔的参数指定要运行的命令。

2)options        -  它可能包含以下一个或多个选项:

  • cwd                    -  它指定子进程的当前工作目录。
  • env                     -  它指定环境键值对。
  • encoding         -  String字符串(默认值:'utf8')
  • Shell                 -  它指定字符串Shell来执行命令(默认值:在UNIX上为'/bin/sh',在Windows上为'cmd.exe')
  • timeout           -   Number(默认值:0)
  • maxBuffer     -   Number(默认值:200 * 1024)
  • killSignal       -  String字符串(默认值:'SIGTERM')
  • uid Number  -  设置进程的用户身份。
  • gid Number  -  设置进程的组标识。

Callback         -  回调函数指定三个参数error,stdout和stderr,当进程终止时,将使用以下输出调用该参数。

child_process.exec()示例1

让无涯教程看一个简单的流程示例,以打印流程的体系结构,pid,平台和版本。

文件:child_process_example1.js.

const exec = require('child_process').exec;
exec('my.bat', (err, stdout, stderr) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(stdout);
});

创建名为my.bat的批处理文件,其中包含以下代码:

文件:my.bat

dir
mkdir child

打开Node.js命令提示符并运行以下代码:

node child_process_example1.js

它将执行两个命令dir和mkdir child。 dir命令将显示当前目录的列表,而mkdir命令将创建一个新目录。对于linux,可以使用ls命令显示当前目录列表。

Node.js child process example 1

它也会创建一个新目录。

Node.js child process example 2

child_process.exec()示例2

创建两个名为support.js和master.js的js文件,其代码如下:

文件:support.js.

console.log("Child Process " + process.argv[2] + " executed." );

文件:master.js.

const fs = require('fs');  
const child_process = require('child_process');  
for(var i=0; i<3; i++) {  
   var workerProcess = child_process.exec('node support.js '+i,  
      function (error, stdout, stderr) {  
         if (error) {  
            console.log(error.stack);  
            console.log('Error code: '+error.code);  
            console.log('Signal received: '+error.signal);  
         }  
         console.log('stdout: ' + stdout);  
         console.log('stderr: ' + stderr);  
      });  
      workerProcess.on('exit', function (code) {  
      console.log('Child process exited with exit code '+code);  
   });  
}  

打开node.js命令提示符并运行以下代码:

node master.js
Node.js child process exec() example 1

child_process.spawn()

child_process.spawn()方法使用给定命令启动新进程。此方法返回流(stdout和stderr),通常在进程返回大量数据时使用。

语法:

child_process.spawn(command[, args][, options]) 

参数:

1)command     - 它指定要运行的命令。

2)args              - 它指定字符串参数的数组列表。

3)options         - 它可能包含以下选项中的一个或多个:

  • cwd                               -  它指定子进程的当前工作目录。
  • env                                -  它指定环境键值对。
  • stdio                             -  array |string  stdio配置
  • customFds                 -  stdio的文件描述符,不推荐使用
  • detached Boolean   - 成为进程组长
  • uid Number               - 设置进程的用户身份。
  • gid Number               - 设置进程的组标识。

child_process.spawn()

创建两个名为support.js和master.js的js文件,其代码如下:

文件:support.js.

console.log("Child Process " + process.argv[2] + " executed." );

文件:master.js.

const fs = require('fs');  
const child_process = require('child_process');  
 for(var i=0; i<3; i++) {  
   var workerProcess = child_process.spawn('node', ['support.js', i]);  
  workerProcess.stdout.on('data', function (data) {  
      console.log('stdout: ' + data);  
   });  
 workerProcess.stderr.on('data', function (data) {  
      console.log('stderr: ' + data);  
   });  
 workerProcess.on('close', function (code) {  
      console.log('child process exited with code ' + code);  
   });  
}  

打开node.js命令提示符并运行以下代码:

node master.js
Node.js child process spawn() example 1

child_process.fork()

child_process.fork方法是spawn()创建Node进程的一种特殊情况。除了将所有方法都包含在常规ChildProcess实例中之外,此方法还通过内置的通信通道返回对象。

语法:

child_process.fork(modulePath[, args][, options]) 

参数:

1)modulePath    -  这是一个字符串,指定要在子进程中运行的模块。

2)args                -  它指定字符串参数的数组列表。

3)options           -  它可能包含以下选项中的一个或多个:

  • cwd                    -  它指定子进程的当前工作目录。
  • env                     - 指定环境键值对。
  • execPath          -  这是一个字符串可执行文件,用于创建子进程。
  • execArgv          -  它指定传递给可执行文件的字符串参数的数组列表(默认值:process.execargv)。
  • silent                 -  它指定boolean如果是true,stdin,stdout和stderr的子进程将被送到父级,否则它们将从父进程中继承,
  • uid Number    -   设置进程的用户身份。
  • gid Number    -  设置进程的组标识。

child_process.fork()示例

创建两个名为support.js和master.js的js文件,其代码如下:

文件:support.js.

const fs = require('fs');  
const child_process = require('child_process');  
 for(var i=0; i<3; i++) {  
   var worker_process = child_process.fork("support.js", [i]);    
  worker_process.on('close', function (code) {  
      console.log('child process exited with code ' + code);  
   });  
}  

打开node.js命令提示符并运行以下代码:

node master.js
Node.js child process fork() example 1

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

深入浅出gRPC -〔李林锋〕

Go语言核心36讲 -〔郝林〕

Kafka核心技术与实战 -〔胡夕〕

TypeScript开发实战 -〔梁宵〕

Node.js开发实战 -〔杨浩〕

软件设计之美 -〔郑晔〕

分布式数据库30讲 -〔王磊〕

小马哥讲Spring AOP编程思想 -〔小马哥〕

结构学习力 -〔李忠秋〕

好记忆不如烂笔头。留下您的足迹吧 :)