Node.js中创建和管理外部进程详解

前端技术 2023/09/06 JavaScript

Node被设计用来高效的处理I/O操作,但是你应该知道,有些类型的程序并不适合这种模式。比如,如果你打算用Node处理一个CPU密集的任务,你可能会堵塞事件循环,并因此降低了程序的响应。替代办法是,把CPU密集的任务分配给一个单独的进程来处理,从而释放事件循环。Node允许你产生进程,并把这个新进程做为它父进程的子进程。在Node里,子进程可以和父进程进行双向通信,而且在某种程度上,父进程还可以监控和管理子进程。

另外一种需要使用子进程的情况是,当你想简单地执行一个外部命令,并让Node获取命令的返回值时。比如,你可以执行一个UNIX命令、脚本或者其他那些不能在Node里直接执行的命令。

本章将向你展示如何执行外部命令,创建,并和子进程通信,以及终结子进程。重点是让你了解如何在Node进程外完成一系列任务。

执行外部命令

当你需要执行一个外部shell命令或可执行文件时,你可以使用child_process模块,像这样导入它:

使用Buffer处理,编码,解码二进制数据”。

1.timeout —— 以毫秒为单位的命令执行超时时间,默认是0,即无限制,一直等到子进程结束。
2.maxBuffer —— 指定stdout流和stderr流允许输出的最大字节数,如果达到最大值,子进程会被杀死。默认值是200*1024。
3.killSignal —— 当超时或者输出缓存达到最大值时发送给子进程的终结信号。默认值是“SIGTERM”,它将给子进程发送一个终结信号。通常都会使用这种有序的方式来结束进程。当用SIGTERM信号时,进程接收到以后还可以进行处理或者重写信号处理器的默认行为。如果目标进程需要,你可以同时向他传递其它的信号(比如SIGUSR1)。你也可以选择发送一个SIGKILL信号,它会被操作系统处理并强制立刻结束子进程,这样的话,子进程的任何清理操作都不会被执行。

如果你想更进一步的控制进程的结束,可以使用child_process.spawn命令,后面会介绍。

1.evn —— 指定传递给子进程的环境变量,默认是null,也就是说子进程会继承在它被创建之前的所有父进程的环境变量。

注意:使用killSignal选项,你可以以字符串的形式向目标进程发送信号。在Node里信号以字符串的形式存在,下面是UNIX信号和对应默认操作的列表:

你可能想为子进程提供一组可扩展的父级环境变量。如果直接去修改process.env对象,你会改变Node进程内所有模块的环境变量,这样会惹很多麻烦。替代方案是,创建一个新对象,复制process.env里的所有参数,见例子8-2:

LISTING 8-2:使用参数化的环境变量来执行命令(源码:chapter8/02_env_vars_augment.js)

复制代码 代码如下:

var env = process.env,
    varName,
    envCopy = {},
    exec = require(‘child_prcess\').exec;
//将process.env复制到envCopy
for( vaName in ev){
    envCopy[varName] = env[varName];
}

//设置一些自定义变量
envCopy[‘CUSTOM ENV VAR1\'] = ‘some value\';
envCopy[‘CUSTOM ENV VAR2\'] = ‘some other value\';

//使用process.env和自定义变量来执行命令
exec(‘ls –la\',{env: envCopy}, function(err,stdout,stderr){
    if(err){ throw err; }
    console.log(‘stdout:\', stdout);
    console.log(‘stderr:\',stderr);
}

本文地址:https://www.stayed.cn/item/15767

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。