Node.js中创建和管理外部进程详解_node.js
Node被设计用来高效的处理I/O操作,但是你应该知道,有些类型的程序并不适合这种模式。比如,如果你打算用Node处理一个CPU密集的任务,你可能会堵塞事件循环,并因此降低了程序的响应。替代办法是,把CPU密集的任务分配给一个单独的进程来处理,从而释放事件循环。Node允许你产生进程,并把这个新进程做为它父进程的子进程。在Node里,子进程可以和父进程进行双向通信,而且在某种程度上,父进程还可以监控和管理子进程。
另外一种需要使用子进程的情况是,当你想简单地执行一个外部命令,并让Node获取命令的返回值时。比如,你可以执行一个UNIX命令、脚本或者其他那些不能在Node里直接执行的命令。
本章将向你展示如何执行外部命令,创建,并和子进程通信,以及终结子进程。重点是让你了解如何在Node进程外完成一系列任务。
执行外部命令
当你需要执行一个外部shell命令或可执行文件时,你可以使用child_process模块,像这样导入它:
var child_process = require(‘child_process')
然后可以用模块内的exec函数来执行外部命令:
var exec = child_process.exec;
exec(command,callback);
exec的第一个参数是你准备执行的shell命令字符串,第二个参数是一个回调函数。这个回调函数将会在exec执行完外部命令或者有错误发生时被调用。回调函数有三个参数:error,stdout,stderr,看下面的例子:
exec(‘ls',function(err,stdout,stderr){
//译者注:如果使用windows,可改为windows命令,比如dir,后面不再赘述
});
如果有错误发生,第一个参数将会是一个Error类的实例,如果第一个参数不包含错误,那么第二个参数stdout将会包含命令的标准输出。最后一个参数包含命令相关的错误输出。
列表8-1 展示了一个复杂些的执行外部命令的例子
LISTING 8-1:执行外部命令(源码:chapter8/01_external_command.js)
//导入child_process模块的exec函数
var exec = require(‘child_process').exec;
//调用“cat *.js | wc -l”命令
exec(‘cat *.js | wc –l ‘, function(err, stdout, stderr ){ //第四行
//命令退出或者调用失败
if( err ){
//启动外部进程失败
console.log(‘child_process 退出,错误码是:',err.code);
return;
}
}
第四行,我们把“cat *.js | wc -l”作为第一个参数传递给exec,你也可以尝试任何其它命令,只要你在shell里使用过的命令都可以。
然后将一个回调函数作为第二个参数,它将会在错误发生或者子进程终结的时候被调用。
还可以在回调函数之前传递第三个可选参数,它包含一些配置选项,比如:
var exec = require(‘child_process').exec;
var options ={
timeout: 1000,
killSignal: ‘SIGKILL'
};
exec(‘cat *.js | wc –l ‘, options, function(err,stdout,stderr){
//…
});
可以使用的参数有: