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

你可能想为子进程提供一组可扩展的父级环境变量。如果直接去修改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);
}

上面例子,创建了一个用来保存环境变量的envCopy变量,它首先从process.env那里复制Node进程的环境变量,然后又添加或替换了一些需要修改的环境变量,最后把envCopy作为环境变量参数传递给exec函数并执行外部命令。

记住,环境变量是通过操作系统在进程之间传递的,所有类型的环境变量值都是以字符串的形式到达子进程的。比如,如果父进程将数字123作为一个环境变量,子进程将会以字符串的形式接收“123”。

下面的例子,将在同一个目录里建立2个Node脚本:parent.js和child.js,第一个脚本将会调用第二个,下面我们来创建这两个文件:

LISTING 8-3: 父进程设置环境变量(chapter8/03_environment_number_parent.js)

复制代码 代码如下:


var exec = require('child_process').exec;

exec('node child.js', {env: {number: 123}}, function(err, stdout, stderr) {

if (err) { throw err; }

console.log('stdout:\n', stdout);

console.log('stderr:\n', stderr);

});

把这段代码保存到parent.js,下面是子进程的源码,把它们保存到child.js(见例8-4)

例 8-4: 子进程解析环境变量(chapter8/04_environment_number_child.js)

复制代码 代码如下:


var   number = process.env.number;

console.log(typeof(number)); // → "string"

number = parseInt(number, 10);

console.log(typeof(number)); // → "number"

当你把这个文件保存为child.js后,就可以在这个目录下运行下面的命令:

复制代码 代码如下:


$ node parent.js

将会看到如下的输出:

复制代码 代码如下:


sdtou:

string

number

stderr:

可以看到,尽管父进程传递了一个数字型的环境变量,但是子进程却以字符串形式接收它(参见输出的第二行),在第三行你把这个字符串解析成了一个数字。

生成子进程

如你所见,可以使用child_process.exec()函数来启动外部进程,并在进程结束的时候调用你的回调函数,这样用起来很简单,不过也有一些缺点:

1.除了使用命令行参数和环境变量,使用exec()无法和子进程通信
2.子进程的输出是被缓存的,因此你无法流化它,它可能会耗尽内存

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgspdp.html