例如,我正在节点中运行最基本的webServer(我使用的是windows(,代码如下(命名为server.js(:
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello Worldn');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
我想把它作为一个子进程来运行,并成功地使用了以下程序:
var exec = require('child_process').exec;
var serv = exec('node server.js', function(error, stdout, stderr){
console.log('outputs & errors:' + error, stdout, stderr);
});
但是,运行第二个文件后,我什么也没有收到。没有"outputs&errors",没有"Server running at…"。如果我在浏览器中键入localhost:1337,我会得到"hello world",所以我知道它正在运行。有没有办法通过管道发送"服务器正在运行…",这样我就可以"确定"它在监听?
Exec将在子级完成时返回STDOUT
和STDERR
,请参见exec
。这就是为什么在服务器启动时看不到任何输出的原因。
您想要的是fork
,它会自动将子进程STDOUT
和STDERR
连接到您的父进程。如果您的子进程是节点进程,则这是首选方式。
如果你想使用exec,你可以使用子进程的流来获取你的数据,例如:
child.stdout.pipe(process.stdout);
child.stderr.pipe(process.stderr);
var child_process = nw.require('child_process');
var spawn = child_process
//以下是在windows上,我将stdout和stderr记录到我的记录器中
var proc = spawn('cmd.exe', ['/S', '/C', script_path]);
proc.stdout.on('data', function(data) {
logger(logtag, 'proc_stdout: ' + data);
});
proc.stderr.on('data', function(data) {
logger(logtag, 'proc_stderr: ' + data);
});
只需指定您希望子进程继承父进程的stdio:
require('child_process').exec('node server.js', { stdio: 'inherit' });